From ea2860eb334ac861be958ca565732cfc8d97c777 Mon Sep 17 00:00:00 2001 From: Aasim Khan Date: Thu, 13 Jan 2022 09:32:13 -0800 Subject: [PATCH] Pushing initial work for done in Query plan feature to main (#17986) * Adding initial boilerplate for qp2 * Adding feature flag in query plan 2 * Clearing show plan 2 after every run * Adding sub tree cost * removing unused method. * WIP 2 * Adding properties view and relative cost to query plan * WIP * Add icons to ads * Assing relative costs and prop windows * Enabling older query plan again * Making some PR fixes * Some more PR related fixes * Use MS org azdataGraph module * Moving new properties to azdata proposed. * Moving new class properties to proposed * added missing doc component. * Changing how azdatagraph package is referenced * Removing empty lines, fixing localization keys * Removing empty line, localizing some string * making css classes more specific * making some logic concise * localizing some more strings * Making more css classes specific * Removing important tag from css props * Checking if sum is greater than 0 to prevent divide by zero exceptions * Fixed loader error in bootstrap * Fixing query index * -fixing image paths -making css class more class specific by using nested selectors Co-authored-by: kburtram --- .eslintrc.json | 3 +- package.json | 3 +- src/bootstrap-window.js | 5 +- src/sql/azdata.proposed.d.ts | 107 ++++ .../contrib/query/browser/queryResultsView.ts | 38 +- .../browser/actions/propertiesAction.ts | 23 + .../queryplan2/browser/images/collapse.gif | Bin 0 -> 846 bytes .../queryplan2/browser/images/expand.gif | Bin 0 -> 851 bytes .../browser/images/icons/adaptive_join.png | Bin 0 -> 2148 bytes .../browser/images/icons/aggregate.png | Bin 0 -> 2035 bytes .../queryplan2/browser/images/icons/apply.png | Bin 0 -> 1184 bytes .../images/icons/arithmetic_expression.png | Bin 0 -> 2644 bytes .../browser/images/icons/assert.png | Bin 0 -> 867 bytes .../browser/images/icons/assign.png | Bin 0 -> 2615 bytes .../images/icons/batch_hash_table_build.png | Bin 0 -> 1386 bytes .../browser/images/icons/bitmap.png | Bin 0 -> 1885 bytes .../browser/images/icons/bookmark_lookup.png | Bin 0 -> 1632 bytes .../browser/images/icons/broadcast.png | Bin 0 -> 2409 bytes .../images/icons/clustered_index_delete.png | Bin 0 -> 3038 bytes .../images/icons/clustered_index_insert.png | Bin 0 -> 2928 bytes .../images/icons/clustered_index_merge.png | Bin 0 -> 3231 bytes .../images/icons/clustered_index_scan.png | Bin 0 -> 2838 bytes .../images/icons/clustered_index_seek.png | Bin 0 -> 4774 bytes .../images/icons/clustered_index_update.png | Bin 0 -> 3381 bytes .../browser/images/icons/clustered_update.png | Bin 0 -> 3902 bytes .../browser/images/icons/collapse.png | Bin 0 -> 1449 bytes .../images/icons/columnstore_index_delete.png | Bin 0 -> 1441 bytes .../images/icons/columnstore_index_insert.png | Bin 0 -> 1623 bytes .../images/icons/columnstore_index_merge.png | Bin 0 -> 2970 bytes .../images/icons/columnstore_index_scan.png | Bin 0 -> 1298 bytes .../images/icons/columnstore_index_update.png | Bin 0 -> 1812 bytes .../browser/images/icons/compute_scalar.png | Bin 0 -> 1106 bytes .../images/icons/compute_to_control_node.png | Bin 0 -> 1946 bytes .../browser/images/icons/concatenation.png | Bin 0 -> 908 bytes .../browser/images/icons/const_table_get.png | Bin 0 -> 1327 bytes .../browser/images/icons/constant_scan.png | Bin 0 -> 1114 bytes .../images/icons/control_to_compute_nodes.png | Bin 0 -> 1992 bytes .../browser/images/icons/convert.png | Bin 0 -> 2932 bytes .../browser/images/icons/cursor_catch_all.png | Bin 0 -> 1865 bytes .../browser/images/icons/declare.png | Bin 0 -> 1981 bytes .../browser/images/icons/delete.png | Bin 0 -> 1601 bytes .../browser/images/icons/deleted_scan.png | Bin 0 -> 1644 bytes .../browser/images/icons/dynamic.png | Bin 0 -> 1459 bytes .../images/icons/external_broadcast.png | Bin 0 -> 2538 bytes .../browser/images/icons/external_export.png | Bin 0 -> 1707 bytes .../images/icons/external_local_streaming.png | Bin 0 -> 1353 bytes .../images/icons/external_round_robin.png | Bin 0 -> 1965 bytes .../browser/images/icons/external_shuffle.png | Bin 0 -> 2564 bytes .../browser/images/icons/fetch_query.png | Bin 0 -> 1472 bytes .../browser/images/icons/filter.png | Bin 0 -> 980 bytes .../icons/foreign_key_references_check.png | Bin 0 -> 1465 bytes .../queryplan2/browser/images/icons/get.png | Bin 0 -> 1313 bytes .../images/icons/group_by_aggregate.png | Bin 0 -> 1615 bytes .../browser/images/icons/hash_match.png | Bin 0 -> 1235 bytes .../browser/images/icons/hash_match_root.png | Bin 0 -> 1308 bytes .../browser/images/icons/hash_match_team.png | Bin 0 -> 1342 bytes .../queryplan2/browser/images/icons/if.png | Bin 0 -> 4548 bytes .../browser/images/icons/index_delete.png | Bin 0 -> 2292 bytes .../browser/images/icons/index_insert.png | Bin 0 -> 2138 bytes .../browser/images/icons/index_scan.png | Bin 0 -> 2188 bytes .../browser/images/icons/index_seek.png | Bin 0 -> 3583 bytes .../browser/images/icons/index_spool.png | Bin 0 -> 2675 bytes .../browser/images/icons/index_update.png | Bin 0 -> 2595 bytes .../browser/images/icons/insert.png | Bin 0 -> 966 bytes .../browser/images/icons/inserted_scan.png | Bin 0 -> 1440 bytes .../browser/images/icons/intrinsic.png | Bin 0 -> 1973 bytes .../images/icons/iterator_catch_all.png | Bin 0 -> 843 bytes .../queryplan2/browser/images/icons/join.png | Bin 0 -> 1124 bytes .../browser/images/icons/keyset.png | Bin 0 -> 3930 bytes .../icons/language_construct_catch_all.png | Bin 0 -> 1880 bytes .../browser/images/icons/locate.png | Bin 0 -> 2686 bytes .../browser/images/icons/log_row_scan.png | Bin 0 -> 1240 bytes .../browser/images/icons/merge_interval.png | Bin 0 -> 1638 bytes .../browser/images/icons/merge_join.png | Bin 0 -> 1608 bytes .../browser/images/icons/nested_loops.png | Bin 0 -> 1419 bytes .../browser/images/icons/parallelism.png | Bin 0 -> 1558 bytes .../images/icons/parameter_table_scan.png | Bin 0 -> 1094 bytes .../browser/images/icons/population_query.png | Bin 0 -> 1417 bytes .../browser/images/icons/predict.png | Bin 0 -> 5193 bytes .../queryplan2/browser/images/icons/print.png | Bin 0 -> 2077 bytes .../browser/images/icons/project.png | Bin 0 -> 783 bytes .../queryplan2/browser/images/icons/rank.png | Bin 0 -> 1475 bytes .../browser/images/icons/refresh_query.png | Bin 0 -> 1873 bytes .../browser/images/icons/remote_delete.png | Bin 0 -> 1405 bytes .../images/icons/remote_index_scan.png | Bin 0 -> 2242 bytes .../images/icons/remote_index_seek.png | Bin 0 -> 2103 bytes .../browser/images/icons/remote_insert.png | Bin 0 -> 1299 bytes .../browser/images/icons/remote_query.png | Bin 0 -> 1122 bytes .../browser/images/icons/remote_scan.png | Bin 0 -> 1333 bytes .../browser/images/icons/remote_update.png | Bin 0 -> 1755 bytes .../browser/images/icons/result.png | Bin 0 -> 908 bytes .../browser/images/icons/rid_lookup.png | Bin 0 -> 3250 bytes .../browser/images/icons/row_count_spool.png | Bin 0 -> 1663 bytes .../browser/images/icons/segment.png | Bin 0 -> 897 bytes .../browser/images/icons/sequence.png | Bin 0 -> 995 bytes .../browser/images/icons/sequence_project.png | Bin 0 -> 1328 bytes .../browser/images/icons/set_function.png | Bin 0 -> 3064 bytes .../browser/images/icons/shuffle.png | Bin 0 -> 2415 bytes .../icons/single_source_round_robin.png | Bin 0 -> 1820 bytes .../images/icons/single_source_shuffle.png | Bin 0 -> 1822 bytes .../browser/images/icons/snapshot.png | Bin 0 -> 1729 bytes .../queryplan2/browser/images/icons/sort.png | Bin 0 -> 1835 bytes .../queryplan2/browser/images/icons/split.png | Bin 0 -> 1568 bytes .../queryplan2/browser/images/icons/spool.png | Bin 0 -> 1684 bytes .../queryplan2/browser/images/icons/sql.png | Bin 0 -> 3718 bytes .../browser/images/icons/stream_aggregate.png | Bin 0 -> 2110 bytes .../browser/images/icons/switch.png | Bin 0 -> 1687 bytes .../browser/images/icons/table_delete.png | Bin 0 -> 1189 bytes .../browser/images/icons/table_insert.png | Bin 0 -> 1121 bytes .../browser/images/icons/table_merge.png | Bin 0 -> 1772 bytes .../browser/images/icons/table_scan.png | Bin 0 -> 1075 bytes .../browser/images/icons/table_spool.png | Bin 0 -> 1463 bytes .../browser/images/icons/table_update.png | Bin 0 -> 1463 bytes .../images/icons/table_valued_function.png | Bin 0 -> 1921 bytes .../queryplan2/browser/images/icons/top.png | Bin 0 -> 867 bytes .../queryplan2/browser/images/icons/trim.png | Bin 0 -> 1822 bytes .../queryplan2/browser/images/icons/udx.png | Bin 0 -> 1764 bytes .../queryplan2/browser/images/icons/union.png | Bin 0 -> 883 bytes .../browser/images/icons/union_all.png | Bin 0 -> 875 bytes .../browser/images/icons/update.png | Bin 0 -> 1475 bytes .../browser/images/icons/window_aggregate.png | Bin 0 -> 1962 bytes .../queryplan2/browser/media/queryPlan2.css | 69 +++ .../contrib/queryplan2/browser/queryPlan.ts | 582 ++++++++++++++++++ .../services/query/common/queryManagement.ts | 7 +- .../services/query/common/queryModel.ts | 9 +- .../query/common/queryModelService.ts | 15 + .../services/query/common/queryRunner.ts | 16 +- src/typings/azdataGraph.d.ts | 9 + yarn.lock | 4 + 129 files changed, 882 insertions(+), 8 deletions(-) create mode 100644 src/sql/workbench/contrib/queryplan2/browser/actions/propertiesAction.ts create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/collapse.gif create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/expand.gif create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/adaptive_join.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/aggregate.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/apply.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/arithmetic_expression.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/assert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/assign.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/batch_hash_table_build.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/bitmap.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/bookmark_lookup.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/broadcast.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_delete.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_insert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_merge.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_seek.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_update.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_update.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/collapse.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_delete.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_insert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_merge.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_update.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/compute_scalar.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/compute_to_control_node.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/concatenation.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/const_table_get.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/constant_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/control_to_compute_nodes.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/convert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/cursor_catch_all.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/declare.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/delete.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/deleted_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/dynamic.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/external_broadcast.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/external_export.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/external_local_streaming.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/external_round_robin.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/external_shuffle.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/fetch_query.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/filter.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/foreign_key_references_check.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/get.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/group_by_aggregate.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/hash_match.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/hash_match_root.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/hash_match_team.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/if.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/index_delete.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/index_insert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/index_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/index_seek.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/index_spool.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/index_update.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/insert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/inserted_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/intrinsic.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/iterator_catch_all.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/join.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/keyset.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/language_construct_catch_all.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/locate.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/log_row_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/merge_interval.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/merge_join.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/nested_loops.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/parallelism.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/parameter_table_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/population_query.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/predict.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/print.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/project.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/rank.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/refresh_query.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_delete.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_index_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_index_seek.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_insert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_query.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_update.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/result.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/rid_lookup.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/row_count_spool.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/segment.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/sequence.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/sequence_project.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/set_function.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/shuffle.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/single_source_round_robin.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/single_source_shuffle.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/snapshot.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/sort.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/split.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/spool.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/sql.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/stream_aggregate.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/switch.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/table_delete.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/table_insert.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/table_merge.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/table_scan.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/table_spool.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/table_update.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/table_valued_function.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/top.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/trim.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/udx.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/union.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/union_all.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/update.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/images/icons/window_aggregate.png create mode 100644 src/sql/workbench/contrib/queryplan2/browser/media/queryPlan2.css create mode 100644 src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts create mode 100644 src/typings/azdataGraph.d.ts diff --git a/.eslintrc.json b/.eslintrc.json index 3bb2037222..5e9f43601c 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -761,7 +761,8 @@ "vscode-textmate", "vscode-oniguruma", "iconv-lite-umd", - "jschardet" + "jschardet", + "azdataGraph" ] }, { diff --git a/package.json b/package.json index 6f6fefca25..7098b10ad6 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,8 @@ "xterm-headless": "4.14.0-beta.11", "yauzl": "^2.9.2", "yazl": "^2.4.3", - "zone.js": "^0.8.4" + "zone.js": "^0.8.4", + "azdataGraph": "github:Microsoft/azdataGraph#0.0.5" }, "devDependencies": { "7zip": "0.0.6", diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index 1e0c902535..7338933e8a 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -141,7 +141,8 @@ 'jschardet': `${baseNodeModulesPath}/jschardet/dist/jschardet.min.js`, '@vscode/vscode-languagedetection': `${baseNodeModulesPath}/@vscode/vscode-languagedetection/dist/lib/index.js`, 'tas-client-umd': `${baseNodeModulesPath}/tas-client-umd/lib/tas-client-umd.js`, - 'ansi_up': `${baseNodeModulesPath}/ansi_up/ansi_up.js` + 'ansi_up': `${baseNodeModulesPath}/ansi_up/ansi_up.js`, + 'azdataGraph': `${baseNodeModulesPath}/azdataGraph/dist/build.js` }; // For priviledged renderers, allow to load built-in and other node.js @@ -153,7 +154,7 @@ // the expected method and so nothing needs to be done - but if it's AMD then the VS Code loader will throw an error // (Can only have one anonymous define call per script file). In order to make packages that do this load correctly // we need to add them to the list below to tell the loader that these should be loaded using AMD as well - loaderConfig.amdModulesPattern = /(vs|sql)\/|(^vscode-textmate$)|(^vscode-oniguruma$)|(^xterm$)|(^xterm-addon-search$)|(^xterm-addon-unicode11$)|(^xterm-addon-webgl$)|(^iconv-lite-umd$)|(^jschardet$)|(^@vscode\/vscode-languagedetection$)|(^tas-client-umd$)|(^ansi_up$)/; // {{SQL CARBON EDIT}} include sql and ansi_up in regex + loaderConfig.amdModulesPattern = /(vs|sql)\/|(^vscode-textmate$)|(^vscode-oniguruma$)|(^xterm$)|(^xterm-addon-search$)|(^xterm-addon-unicode11$)|(^xterm-addon-webgl$)|(^iconv-lite-umd$)|(^jschardet$)|(^@vscode\/vscode-languagedetection$)|(^tas-client-umd$)|(^ansi_up$)|(^azdataGraph$)/; // {{SQL CARBON EDIT}} include sql and ansi_up in regex } // Signal before require.config() diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index 02893b0602..375f36c0b9 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -913,11 +913,22 @@ declare module 'azdata' { action: ActionOnCellCheckboxCheck; } + export interface QueryExecuteResultSetNotificationParams { + /** + * Contains query plans returned by the database in ResultSets. + */ + executionPlans: QueryPlanGraph[]; + } + export interface ResultSetSummary { /** * The visualization options for the result set. */ visualization?: VisualizationOptions; + /** + * Generic query plan graph to be displayed in the results view. + */ + showplangraph?: QueryPlanGraph; } /** @@ -1392,4 +1403,100 @@ declare module 'azdata' { errors?: { message: string, property?: DesignerEditPath }[]; } } + + export interface QueryPlanGraph { + /** + * Root of the query plan tree + */ + root: QueryPlanGraphNode; + /** + * Underlying query for the query plan graph. + */ + query: string; + } + + export interface QueryPlanGraphNode { + /** + * Type of the node. This property determines the icon that is displayed for it + */ + type: string; + /** + * Cost associated with the node + */ + cost: number; + /** + * Cost of the node subtree + */ + subTreeCost: number; + /** + * Relative cost of the node compared to its siblings. + */ + relativeCost: number; + /** + * Time take by the node operation in milliseconds + */ + elapsedTimeInMs: number; + /** + * Node properties to be shown in the tooltip + */ + properties: QueryPlanGraphElementProperty[]; + /** + * Display name for the node + */ + name: string; + /** + * Description associated with the node. + */ + description: string; + /** + * Subtext displayed under the node name + */ + subtext: string[]; + /** + * Direct children of the nodes. + */ + children: QueryPlanGraphNode[]; + /** + * Edges corresponding to the children. + */ + edges: QueryGraphEdge[]; + } + + export interface QueryGraphEdge { + /** + * Count of the rows returned by the subtree of the edge. + */ + rowCount: number; + /** + * Size of the rows returned by the subtree of the edge. + */ + rowSize: number; + /** + * Edge properties to be shown in the tooltip. + */ + properties: QueryPlanGraphElementProperty[] + } + + export interface QueryPlanGraphElementProperty { + /** + * Name of the property + */ + name: string; + /** + * Formatted value for the property + */ + formattedValue: string; + /** + * Flag to show/hide props in tooltip + */ + showInToolTip: boolean; + /** + * Display order of property + */ + displayOrder: number; + /** + * Flag to indicate if the property has a longer value so that it will be shown at the bottom of the tooltip + */ + isLongString: boolean; + } } diff --git a/src/sql/workbench/contrib/query/browser/queryResultsView.ts b/src/sql/workbench/contrib/query/browser/queryResultsView.ts index 9c98fac4dc..0de3759434 100644 --- a/src/sql/workbench/contrib/query/browser/queryResultsView.ts +++ b/src/sql/workbench/contrib/query/browser/queryResultsView.ts @@ -25,6 +25,7 @@ import { URI } from 'vs/base/common/uri'; import { attachTabbedPanelStyler } from 'sql/workbench/common/styler'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ILogService } from 'vs/platform/log/common/log'; +import { QueryPlan2Tab } from 'sql/workbench/contrib/queryplan2/browser/queryPlan'; class MessagesView extends Disposable implements IPanelView { private messagePanel: MessagePanel; @@ -163,6 +164,7 @@ export class QueryResultsView extends Disposable { private messagesTab: MessagesTab; private chartTab: ChartTab; private qpTab: QueryPlanTab; + private qp2Tab: QueryPlan2Tab; private topOperationsTab: TopOperationsTab; private dynamicModelViewTabs: QueryModelViewTab[] = []; @@ -183,6 +185,7 @@ export class QueryResultsView extends Disposable { this._panelView = this._register(new TabbedPanel(container, { showHeaderWhenSingleView: true })); this._register(attachTabbedPanelStyler(this._panelView, themeService)); this.qpTab = this._register(new QueryPlanTab()); + this.qp2Tab = this._register(new QueryPlan2Tab()); this.topOperationsTab = this._register(new TopOperationsTab(instantiationService)); this._panelView.pushTab(this.resultsTab); @@ -223,6 +226,7 @@ export class QueryResultsView extends Disposable { this.hideResults(); this.hideChart(); this.hidePlan(); + this.hidePlan2(); this.hideDynamicViewModelTabs(); this.input?.state.visibleTabs.clear(); if (this.input) { @@ -245,6 +249,15 @@ export class QueryResultsView extends Disposable { } })); + this.runnerDisposables.add(runner.onQueryPlan2Available(e => { + if (this.qp2Tab) { + if (!this.input.state.visibleTabs.has(this.qp2Tab.identifier)) { + this.showPlan2(); + } + this.qp2Tab.view.addGraphs(e.planGraphs); + } + })); + if (this.input?.state.visibleTabs.has(this.chartTab.identifier) && !this._panelView.contains(this.chartTab)) { this._panelView.pushTab(this.chartTab); } else if (!this.input?.state.visibleTabs.has(this.chartTab.identifier) && this._panelView.contains(this.chartTab)) { @@ -257,6 +270,12 @@ export class QueryResultsView extends Disposable { this._panelView.removeTab(this.qpTab.identifier); } + if (this.input?.state.visibleTabs.has(this.qp2Tab.identifier) && !this._panelView.contains(this.qp2Tab)) { + this._panelView.pushTab(this.qp2Tab); + } else if (!this.input?.state.visibleTabs.has(this.qp2Tab.identifier) && this._panelView.contains(this.qp2Tab)) { + this._panelView.removeTab(this.qp2Tab.identifier); + } + if (this.input?.state.visibleTabs.has(this.topOperationsTab.identifier) && !this._panelView.contains(this.topOperationsTab)) { this._panelView.pushTab(this.topOperationsTab); } else if (!this.input?.state.visibleTabs.has(this.topOperationsTab.identifier) && this._panelView.contains(this.topOperationsTab)) { @@ -309,7 +328,7 @@ export class QueryResultsView extends Disposable { this._input = input; this.runnerDisposables.clear(); - [this.resultsTab, this.messagesTab, this.qpTab, this.topOperationsTab, this.chartTab].forEach(t => t.clear()); + [this.resultsTab, this.messagesTab, this.qpTab, this.qp2Tab, this.topOperationsTab, this.chartTab].forEach(t => t.clear()); this.dynamicModelViewTabs.forEach(t => t.clear()); if (input) { @@ -412,6 +431,16 @@ export class QueryResultsView extends Disposable { this.topOperationsTab.view.showPlan(xml); } + public showPlan2() { + if (!this._panelView.contains(this.qp2Tab)) { + this.input?.state.visibleTabs.add(this.qp2Tab.identifier); + if (!this._panelView.contains(this.qp2Tab)) { + this._panelView.pushTab(this.qp2Tab); + } + this._panelView.showTab(this.qp2Tab.identifier); + } + } + public hidePlan() { if (this._panelView.contains(this.qpTab)) { this._panelView.removeTab(this.qpTab.identifier); @@ -422,6 +451,13 @@ export class QueryResultsView extends Disposable { } } + public hidePlan2() { + if (this._panelView.contains(this.qp2Tab)) { + this.qp2Tab.clear(); + this._panelView.removeTab(this.qp2Tab.identifier); + } + } + public hideDynamicViewModelTabs() { this.dynamicModelViewTabs.forEach(tab => { if (this._panelView.contains(tab)) { diff --git a/src/sql/workbench/contrib/queryplan2/browser/actions/propertiesAction.ts b/src/sql/workbench/contrib/queryplan2/browser/actions/propertiesAction.ts new file mode 100644 index 0000000000..8549ef138c --- /dev/null +++ b/src/sql/workbench/contrib/queryplan2/browser/actions/propertiesAction.ts @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { QueryPlan2 } from 'sql/workbench/contrib/queryplan2/browser/queryPlan'; +import { Action } from 'vs/base/common/actions'; +import { Codicon } from 'vs/base/common/codicons'; +import { localize } from 'vs/nls'; + + +export class PropertiesAction extends Action { + public static ID = 'qp.propertiesAction'; + public static LABEL = localize('queryPlanPropertiesActionLabel', "Properties"); + + constructor() { + super(PropertiesAction.ID, PropertiesAction.LABEL, Codicon.listUnordered.classNames); + } + + public override async run(context: QueryPlan2): Promise { + context.propContainer.style.visibility = context.propContainer.style.visibility === 'visible' ? 'hidden' : 'visible'; + } +} diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/collapse.gif b/src/sql/workbench/contrib/queryplan2/browser/images/collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..01e691450c48632dc92a40a8c2b509bf99987225 GIT binary patch literal 846 zcmZ?wbhEHb$FyaIl$)g-gQVfI}k_i-?$k!^A~S3=)P?0Tm31hZvXy UI%HM~I5JIC=Ul}jAi!V^09i~Z*8l(j literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/expand.gif b/src/sql/workbench/contrib/queryplan2/browser/images/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b24ef1248de55c6140895f6760758a1579f14cf GIT binary patch literal 851 zcmZ?wbhEHb$FyaIl$)g-gPK!J(0fMMMlpH!w1DF=kxpFl=aGX3~-h X>0od?I!Q%XL14k81*aJp85yhr3QsCm literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/adaptive_join.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/adaptive_join.png new file mode 100644 index 0000000000000000000000000000000000000000..a9de8452b04e1922ad8cffed0f2c0f686c428639 GIT binary patch literal 2148 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

3UIP}s!?Uvn(`?I25< z=Y!yAqd^;^c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j!|3f>J%<}1_q`%o-U3d6}R5rwVgEELB#c; z*i(;Ntd^@4uBLHBI=0{H30mv4vrO?)p~~&2MUnN&3x3zC&(X}{dN(ug7vuV1CZM4V z41qU%E`JIA%$c|S_F3!W*XwGf{xfe>WMFh)5MW?oU=-+;|Nr~x&ls?cd`SzaMcl={T%-64mOf#6EhBz>+ zV7{`Y@89pe|H}6Z8!(CZy_K&LXkcMcU}W@gU=RW`9Uqo99DX>#Z~5iZ$G_LkZ%eF* zXv!#Uy4ufh*kH-N_wjcBO01S1ewd)5QOTvySj`}`gHxq3^Z*k?ccaw-d&~Lf%kO*t ze^UK%``5p#OPg*N_FvpMHA%{8x63Ik()Im{_JaFdS4>IMA-D z;84KHArQmFGy&*+hfqm2*PUd$n5}_TR!b^?pdc%rPJAs>Pdr)iS?d zTU-o`SgS^9Sggb24V(r*y#0}(^$k)NacPQRBPik-G2s V!(2MzzdwT#nWw9t%Q~loCIEeU>*D|b literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/arithmetic_expression.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/arithmetic_expression.png new file mode 100644 index 0000000000000000000000000000000000000000..532e6985c9ca5070ed42319396b2e52b66ab76ef GIT binary patch literal 2644 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/assert.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/assert.png new file mode 100644 index 0000000000000000000000000000000000000000..8c828bf9c1484309ffd61c5b3e79b27400e7602d GIT binary patch literal 867 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/batch_hash_table_build.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/batch_hash_table_build.png new file mode 100644 index 0000000000000000000000000000000000000000..f955ff4e3ae9a06f8f9719dd581d1811d243dba8 GIT binary patch literal 1386 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j=@yBZkcix0|RrKr;B4q#jUqN*!36mPe;IjsZvmFIHD$Aw2^}|N+Ttm|Vl>ld1``7#3?7(T%kZ}Lqi^u` z`3v4u+9@+Az+s3E^XWPTPod@d7oMt@hH)6oK09aMfn~2>7%kE$ie~sw&631>KuJJ= z0RnHZ7pyqvH|fZ)TCQJ=4Vq9<0R|gw=G$+?JuXjSxh;0!YhB~Ah4K!TUzjcY_TNtz zTru-#(!;GR907+iOg=?1u>|NbGHFa-u!U>E`hW49hYY5?EnDr(aQk({ZPf+x4KEu^ z8?<9$@}54iS*_CeJ-A`nhxoc5O7>mak>cT>{(aauk;OI8fa!`QM8* zin5wl_OX0njyN^Bz1Gs!%0Pt!VJ8d6 zf*2<4)eYUJ*RJWFzqa<@>*xJX?jAoA!8H9l=NcRN2TyD!``^EI@11Z;WZE5nph?a` zGyK@iz6vYA4Ul2EVchO7Z?Z|kh2hZl%{+IO#wXawS>N}1>inZxFkyOK zy=poClVMuYt$$Bno6k3GXk^*f?k`%<%p!Hjz2Uz{Kxw`_qs^oTS2rgvU0${NDi>qT zqz7-iCl>xllrUn=II`^d&))aUSJo!qPP<=Pa`l6yyu(lP`JWjjz6myb0HFiEHGJ}n zJRdA;SQ>t%Cd@9)10}k`)#ewzepkCD)?nUcz>1V~R~cOZCI+LL`h2Co45~l&oj)jY vKnk8{wp={<`A^hm-WOl1WKolKz#;vWhUXW>POW_b%!CY{u6{1-oD!M<@QO(W literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/bitmap.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/bitmap.png new file mode 100644 index 0000000000000000000000000000000000000000..9010b0b75bc4b93a366d11795e836cf008848f7f GIT binary patch literal 1885 zcmZ`(2{fB&7ycq`Y^kME%amiOqDrVGDu@vK-WJsbwG~B>gz1w0LTOP;DP4rp>NIVN zPN#}eDebgjB6MQOnEcAv!lV_IR^_+k|6=|*)A`St^PTs8@45GR?tAZjpYJOO3h>;f z@Qnfh0NcF1+zx_oigd}rK>G?4#R33GULp<`m+|%itFiC%xdk+od5s8@exuSbZ>9S5P@Up-XF_eIFh2?YTWzh!itNWBCl&QdSUn4F|(|-0qwnFd63zBXjp8fL2HY%bJ zQe)Awz7M`7GuwmR@}e}QBVA^tHhXX5%%h>~`9MyRxjA9Wr(~!G*WCXd6!|S>!#Lc^ z&~s@Jp|Evgy@;_#_S2Y5cSvjNEG9sg0?&9#f@*8a>~jApLUj7u!{<^Zw-T4XKu2y8 z1^~T@`{2F6qJ2Hx0EzUe>!e);J@RQ@M~DERs3u(ypsHFEbjp&v{oQ3}6m$@%9W`ma zSOD01#M{j!`1G$IsvnorEfE(7(4m6mkud9_PeBVs%GlKTE{CvW*_hsAbIDp~PhI>b zNtco$Y+P<4GHvJN^$R59XLtXLzhU@W?s_DH!ProlZitACjKrVE;0kUXvjpHkH=y!A z<3ydMBZo3{hBN&A2ZMMmhb6_rRm2uZUX<6vVV~YMp-^b&ELmIIGQO=dZKsQ?99mn6 zgsxfm&n^C$=7>joN@D62V;yQ6R6l(W>E~O|oY@eJSq3wNhpxpnA4e8jQTCGSNiu@= zdml1cNF~(+yq4xM{DY>Xm=SlbI1HxZ`WD|>&k$Cw=QD(ft-Lao=%t*tex?;RoEwaI zo#1@Wq|jT4kV01?)R>{S_#{m2Q;nAym=?&A<6*Sr@8gddaSmb1=w$ddRjmvlPQB?Mem&Z-vIG^&| zpMJPYr^AXLJj6DM9$%w031GG^9GmaVSWW8urG?%fia0iv5keCB05_vvqf2`H#rH?+ zP1;%PbnQb3_q)-_I~=mEi+_P7RC%-;;Zf8M*^Ly_&iLdVgqqS6V06}`&|uG8BO9^l z2~6BISCyl8W4fb#8a?i}+=u>gzO+yj9x^bE6eZq-=yljmp>GU24gP%Q+)0eNH4tx{ z^b)x;D!vO_JTIB$<9M~)1*IcQKU9mtvwkLul5EWT;#3)T=1W)H5g)~eF&ZDxx;!9C z)5qdq$Z)uYgPcC>GwV_jyHWu5-w?WY$uaQk?K>uSJ?Z0~w{a2ei;jV#)TaY|#)EZ( zU7yc7$O)={*eqp+@L=W=@!f5HPX=apah)Yxw)6eseU42H=@h9(_?uIgL@>kSQ90L5 zUeMgt3a8MzNwBu(hn816%LA?nSDVL$#ik_!a)Z_cfxWh}a$@~sY`NhZ^*7R~BWZp6 zON>`Vi8{VHEV4z9Jn2}Ee6Adfasv3v%z1J=R0u2YXRmtyD(9+HJ4SwAjh$W`Wyi-F ztJq(dT}-qC2r%{}b)I2;#X3Q~76sLdf9r=yfnodWZjy;QuU-1hTBgm}?LaWv9ymdc;qtpjxNbM%m2Y|A@8x5lfQCN(sq-bMiI`n_`wG z_*2LV_F1tKI566%#qI79TVD@kfrE7J0LA;yIqtd8vcEbVRFw)?sOa&wO=g9Sv=6)S zSLY}at}j>~i&+Ih3K4(qxPF^ERM$*JLACR_f1JmL%)c2SYx=^^jo^P5@OBSyYjQo2 F^IsvRd=vlx literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/bookmark_lookup.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/bookmark_lookup.png new file mode 100644 index 0000000000000000000000000000000000000000..89d5d11673f4609d8854c022d1ad4b25ac716227 GIT binary patch literal 1632 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_delete.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..6da544c7c1036082b5ba36d7821fb343634940b7 GIT binary patch literal 3038 zcmV<43nBE0P)EX>4Tx04R}tkv&MmKpe$iQ>9WW3U&}t$WWauh>GYYRV;#q(pG5I!Q|2pp-DrM z;^HW{799LotU9+0Yt2!bCVZf;JBE>hzEl0u6Z503ls?%w0>9U#=pOf@^k09CV$ zR6HhTb1P!t6+sLkj9$!0%+wRUyKw^epMfi_<*(F%=}*#Y zEiG~c^lSqc*DX!n11@)f{wG~BBuDbo6bc34{fxdT2lU+n!Bw}n<~~jzfDCoDbORh5 z0wYDrUh{Z&S9@>&o@w^?1J;>x&j29cr~m)}24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jvPK6gUcw`{_FX014VjL_t(|+U;FEY}-Z@e!2v$ zAWm7NSxQDJONMAShX4)iObwtZ2w-hefv{SwZU6wTudg>=XN&;=K)GBl z6{SuJVd&M>)s4)3l}e>V0?2ub-`3i(V2o+)5lYnRi|q|cM1HYFP$Ke+ErJq}Uu+RD z-G+F&y(@0q)x{8OwC^|$IF190#o~YeZ#J7?nkJa0sq9_U1!Tzed!7fjZG-E&p}(uw z>tIA0D%NRAOWO{ zX0w^fy(EC73}E3VU{brX_wwFN0>}VN(}a4xE_`3TUXLUm5C@2b@87>iy-$}#A=-F=Bm*)X zfmlGRNTECcfw}+!34lNXAdmnE zBme>l;D3nogH9bk7EN@Yz*egjc^n)Ssy+;f>;2>b2qXXk34lNXAdmnEBme>lKq&@; zfz&k;fF>|ab0g7%!JrU(0#O&RK?Fr5A3&oMLu5p->2LA?lDN9Mx=H)9shf*G;jf>6 zf`6Pp&?3N+|Bv$r{PpusaC7lzs)VVoXQl)30r`Iqe*y4)_;Nf#ivUahm*WwD@5A52 zUs4x=%6gX;z-qO+$;yYIx5*EnN(A4?50D`d1VV^%atV`tX;uzP*hIc65qw8}Mn!Oa zeJ%afGRteL=aC;(1Y60^s0d`e0TUrV?p80l;DSfKtO&T|uZbW|8)dwKhzM9#$OjNV zqUCP4hyE>A1ZeUl${=H7+#+CEAzub}%qMX7V5m$4!sH(e;g0zvlXZg?0aHnS8po`u z5P?FS;5&1OL^&+||ZC!~w%bjr;U+~%5zJeUWW0~+Io=s15pPmos;2#o@G?%(q~ zI6prReUM=o@aokoEy&NZ2zGXMxW73+Kj(UZfOCd%|2*;m0QUFy;oiM_+K``B5p=s< zs8*{e5n#FjR2RTYG-U0ZT~*{~Q3Qrzz`?;mWX{krz;d~S%gf8q-@JJ70`;=f(^DnC zNs@e(B2Z<2tJUHzEV;bAMCAn-um9&w@>Hu;c=YHIcZ}NW_2BI6j9Z|yvoq-RdQ!Ot znTZ{h>j{#y|Jk!=+-LE)Tdh_%To1sTal*L%)6-L-{DJGb!k$2OR!{Y!lBDc!x7*xU z05e<2FysF)JbwI`TL?@LxhaUjPIpF~(v4FDaoW$@a|x3VU>G%q;r{*mq1WHNdnesz zV(wKnpC6Y9;?^)9IAE?5o{w zgJoHvzd;KC^A%9D*@V$(1WAA~2C|>5$8}&tlro6`d-x_s%#})|#DYI~!x7$?bg@{# zhYueTA-`NMmsFpi83mO}rBp7LOT2(u1#H_!$D_{S=D3aXC zO!i%y>|D2Bw%dV~RNd`%!LqDGR)t?i9YfakJ=#|PQ5#}p_QGbn zk^n~emSqVIpA5s`E~v!5JFCPi6Tqf|Wz8$pYBiWlCMZu(uh(HRnZ&*{UAB)`-OyrJ zaF8z#rcmSZ6e5RQIF9pOlBd~h3Y{e!w;e$virdR*GptMUbhB;i6Y~hBivW@&L>Kb4 z@&KY;L6kU0r~1+|vlo{Lbj*Zmo7z<^0$tPKTIcpv1co{Ve1#K0RBup($*)4q?yct} gHnn!$qI@3y1=_}lOZvXgc>n+a07*qoM6N<$f-XUwd;kCd literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_insert.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..4706b31b6d1169bf38719a555defe2ab18ca77d8 GIT binary patch literal 2928 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 YYO|-dV^!&r)UOy|tZ#vAqH@oF0Wsugb^rhX literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_merge.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..c8191635a5c8dc7603ef9cd8b57ee9abef047a83 GIT binary patch literal 3231 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 Rnd$%l002ovPDHLkV1lBy2*UsX literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_scan.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..58faec26037abd1ba1a9e29b2141c0d28141abc0 GIT binary patch literal 2838 zcmY*b2T;?^690#mNN9-=qQXbOh(SUT5D^s+h=S6UUS1-C6%vRv=~W25S>XdjrAQM* z;6osZRH@Pegx-r7jR=M!FV36yX5QTF-rnBM+}@V^U7Us4C1JtCf&c&r8ygu~ap$l< z1QFo!k2-`-002ebHZZU-HZVYuyov6&@3{d0CN((qywOKJsg{3TePwk*&{xc|-69(s zOIen;#zsW<+uRzW&G(Du85^X{&SGj2QoD8~+O=A1tJ5bS5i%%GPcw?L)$D$nemqh% zY3KXb$+@r6sKHK?Q)gQN>#Brn=j7eVir1$lE(pmcxO5qH4IW&H7CP6)I3E<$5YNW4 z$e~G|$B1gw7 z2^PV$^K`XQyEbb)8~fr;hRO|R8!e)jO{ewnhvT6HOu14)of%oo3o93nHf%4v&g*6u z+h3e|T@JT%QglCT&OGgkJVO9^X3;WSu;Y8=K8@wsO>eG!E=~butGwSkDa7X+ezE&~ zQ?f_B7tgPpaK+Mv^1<*G^ZvU^O5S`M_jn~4N~V*%%6?(Lk2|ZOFR=&21^K7<5*ii2 z8xuS<>zbNH9W$9QA)o5|yi!s;M{%EAe)#*@1`_xGzP-7{JN(qU7eGxHa`Pf^{mLan zVE@m^Z74|RY7UT$?8yKCJ@|(}z_TnQR|&pvY>ERf2ue$U&ggg$bGc@4W5WyA{KwXv z&0`PRBKLirZjt&P(PI>>R1Go(53ab3Su7Jq>#j9dxHw}d4=~v0Sro$*efq3|a(#i* zWx}gAH%Uv;^fyrv7}(Mznf%jNliQ5iqVh49OOztuOD?SFUBVl&jf!?2Nc;Sy1``A|BSq#W3}X^fi4!{l z8j*DwU!^#Sli01iZEHa8OS(zC+6q#)Xwz0L%W3J23 z44E_mm^rUkR^cH{=E_x5EQ428#!)I_fl$0XqG&0(itmxzTmD#W)rVcsxRC}gl7K4_ zbg?1Weyb8dVgUhY7>x%a8AFKjR)Ol-@QN?VTUgb5vRYQ%L59HV+xqh9utt^i4u7~P zR1c2ntiJpTURZot`Kq-wCi8ORU^h=JpkW&M^QTYRvGyBk6^)HaW&+&v#4uIf&tB77 zTLm13xh!tCwgj1!$e*&3(n90JX9G8q+Poa(|5B9Ei?L5)w#j83FwqKfhHnmi7yUeC zvQs=(kuybvHX~3ocu>Xv9L00REHFf@+x=jfb3I~3(tGpEsKr_nc}c|aKUeuLr0++Bks+aJI&0wXryrY9AGal|orU9Bj>`;zM`ipZjZ;uXXb#=4&b)o= zM%8HF93I;vS|2j1PdWzt_>nxb*ndDPO}p7yO%6d@*M|{68I9eLpATZBYO4k4W~g+T z;JZ`;$}ut+0mO%)BZ`=q{*^aUhn{OjJ2w?VRG0crL;F};1TtB@ayItL-h#LNtzLsJ z_%C*I;zeF%=YRONSW}|A{4cGF4iz-jGKfuU7xOPPwkZTI+XK}OrgoV^tl{@g$_Ax2 zM=ycHA-N8v^sir))!}eoKfgSO(g%kH#Z~4RYd-F>HwM>yDj}`H{AGL=Z-$=i#>R!I zNhKT+6fdq){Ss9%n!HHT^Afsr#>Q}Vgj*__r-e9$Hg5{mbw0h7>)%n3P^Bk|V5ILq zxf?yU^St}D#g`5UnCs)SZuwEclx!-qhM3>fvEbdM$EP>5Dh-0~b1h?xmGbQ>{ zJuD9k7A_&SheAvT@Lpc9M2PB5k}C2`J_1lgr*}}t$EC)8p>vp$hC4qv=lmB$06m%s zBmKC!RC&%BvOp=iXK6Fq$1|^NZF!M_^a~6OtQGBB`zcl4+uM8A#eBOi*lgX_+GkdC zGh@?r${s(Snx$7FcJJnTZ4Ps3b6nrrn&9CfJUl!sPXX@kuM8AKN`~2@_r@E&JSsXE zKGOG{b1*z5dvXu)QSw0R4few}^6@KTXgfeQUFJQ+4uGL_O<;V=z|*D84kMAcVFHrd z8eVeLF;?5)xov`xcDC<^eEme3D;odo_1&9h^W%*)e1(eQ38av~&L*6Mvy?gt8qg5U zI)CCGj2q%M_FFC8Y_q@`z)m*#uk-rG8D5?_T`3kXl^uZ>eLm7A1NTdyog1lqVZq%I zEzkT|lQ_i#+v7T;b-!k`KWgh1a&veYUjNe**$ zBSYF=+=MoI53%0h=;(M0w^8#ELDa8`TT1xMdv1|72XJFTQQ_8K8qion~MjfPBCgM!w+_#UL>Htt%xAD}1 zNu2lxH=7_Oa9t%s?WdjcW9ODu&+C(fHw&7Q<`SYqhs1yKhm3>>Fp~o-_GrI`26G@W33Jzjxp>mEvbW~?uMB*3d3Ms-Q9T|avxPK?gojqTFGqF zqoK>h2p7%2h7680q_8gX*|nz7hXMnDd&qY8syyYLBy~;*1@*WyuV+e?L1{<&a@cO1 zbO{PPe$L?}drvI9xYz=Vhz`Qwn(K!(60e2lG)&%ofm?KnvSl|=a_z7$r0-|Ax}~XQ z(c{TWJprqqlb#msKR8#-aD5?Re0(RM+>t#&!IR198ivW;}~+^4vN$GPD#Sh98bgPMdttqQLYc?g~64mKxMiL zdrzG9Qr4&Sik-UDJ~I%EXO@B&K3~mYR$?o#YYpgR0+RKzC}01#>Z3*@=&Qtsru*nC zEAasEdnyaqG19<*+MT#a$Z;{8-slNFs3#8BCWNS9B7(p&Q9_JcD=& zl3?}Lv`QRGUuPjoVpRbf5{G)!Nq39W%h)ZA_jmVNdm(GhN9Xxf_q}Z}7S%pcueha6 zpU>(4=G3fUDuKAL;L=tN5kD=w|NC*lH^y{MdpxyATflOY!_gRhd9}muXvEPX15${N z(%{K+qM+dcT|(YAskkKE1BT&7C3QY#7u6}lION1^XGAvTd6)A-haP@gW0e=^LpGgw zH6<@pA2ve=$m+(jk5_m6Kyh}59PNG=@pG-L4Dt%K(&miVkwLnhkJG^ZzgJ6%>4*U= zk8a0Seo%>U6_v#2Q&(e}wnuE5c^yOvdj&;(Ivbo6*}khU)?BZY^C358$A1?E->wAU zCOS~m%zPC9H~W79oCekkm;GJSl+zX3N=FGm0X literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_seek.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_seek.png new file mode 100644 index 0000000000000000000000000000000000000000..13094bad6599f7152730b7848b1bb8f71a829e22 GIT binary patch literal 4774 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 A!2kdN literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_update.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/clustered_index_update.png new file mode 100644 index 0000000000000000000000000000000000000000..956a8138342737221c08c0b7992f7c957b15b107 GIT binary patch literal 3381 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 J^FhlY>VKa9QZ@hp literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/collapse.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..7e241912b715692c8ca30db0b4d51574bed9dc29 GIT binary patch literal 1449 zcma)5c`(~~6#piY_%#@z)hbG;)?G)ZiWPAr$Rbp+Y+Y4!mAcQ;N~ooXv#PE(Of6lC zZm%d(R!LjMRD*6yW26U)h@+y8Y;5eX4$;Jj7866QE5*7r2X5slloPD>YQjg#9T32m!Jm%OF zmnz+??5Tt9x@j3h9zP6sy&ICQCfO8CPHHlCD{Xi-nlVg1%}i)RX)4(8aB}t`*GXZK zb&kAr-a3E&Eq8t&mfh!g{9tg5PQZkmm85E}?{oX-?48pYlIE;YTuMqu z&Y~_aCN(eoK!j1JhU}oxcuUskr8;B1swIo4t0n3gg33fTT|yQg?GwL7i+OR9diqD2 z--gRsNK&+NTuyRX$ zJvVOXpcp03;%hh`FHm}=XM);6#M~q^QC(dO1|x8G%B`omxUz`}%QQQo1>;y%7pFtk z`;>ZK6k*+N7ZYz7CbSCi{kXx^Hd0@02ZxnI8}*bqwQ{b5b(PgTd`8aUqeF(bH~<&` z0R(`9qz2h_PCs{KeURg~xuQSkMOy;w-wdxtv#F!H`ue3a`t0f08s*f`P=|qm zf#;RdO~4%a*BluAv6Hj2U23j62^chS>p~PZql}G>ZQ)YDCKsPQIG|2acRGF;y39Yn z-=%kzX1SMh6dshq`7gj85M&uk`xiO-fhNmo%Y8C;NV!jBt+4S$1!EIhQZ*<`4 za09npX}SfcQ@nH7pNq$D4LmKGy;oj_ndR}saneK~$2R2A-n$*_g0h=o%@Xg{95>@u z3zAY~3d?R1?w2YA;b`xX2BybKx<7}7BhtStubgh;FL`?b0~GX&H>^F^?;PmHLWL!K zCm??W?!c{p8E7L$dXFNp#_$|&g&0PHI?Q*1L$uCCK``v1wg35)mmphh!GM_ry44np zm=YjKCQ*SSMQMcEX*_f%7NN{a5T~oao4IX>1zGAxJ`p}9;}(qISX?OJNartpcIx>Q zGT~HXo-ZxZ^G{h}6tJzKU}|dFHjf*4jfI#7xk}NDA&{g&FT&c@u^q@U;wOUYnj9 z%OrNnP2lf7bSWJ#30~kYslDb*0>oHLx29Rf1C7=edz+Z z3tEh+!Di{-#>Ogdgea^Sj*N`lcrzD`Tqv*Q!z@Lg_w_Ko;sU!Wa^{^tK}sZYLhI|X ywype5I|gssI{FFMYkuLDM?)m?pFe<6zJ0BtsB}0c5UH3ZngmEhGNH-ZKkavl(SN%D literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_delete.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..cac4731c2724cd337ae1a784ea12c47ede810711 GIT binary patch literal 1441 zcma)*c~H^`6vuxYDS3idW~2mans{br<^c*Sd6uGSW8ST%;(=F12spNisA-;gZf!$r znLBFaW+K#Dp3!>Y(Lc7yv*8i5?z-Bo7Z%T1M)H#N>DYFe|@W?&AFnhwP6Gx^w1; zN;drTKwu-bkp0e-jAa#!g(OT07sfQdBY9NJ&zp7YA$QK+cj|Ur{vbI5V;P|+6o0nW znR$7Id$GP|>Gs;n+}o9dsEJ|UV<(>jGzn)3^> z3ys!WEXA%;^GYcusdj?HS|YpI9}C4rTnEd>b=UOTD&vC9hTMr3RV}xSi0rKr>MzmE zZ?2X2UMzL=#p=zRrNoBV1<#Y_3vXSlw2q4iaZF7Q875CXIh+@5)^5rD$)5^O$D*0W zgn_#;kodEOW3A;eXyUf5rkwFMpu)#gtfYTp=`>Sia4lahT&0XY{kgkdhYf19=6$tQ zgJv^5M|pi^DLv`n&1R-W+hY3!^L@ZrlBHz^bR!wEPi*No2eHaw{BbzK&e%&juA{O? z@|D9kSKgQf3(1cjExGy|G1RgiWin}Pq z_;?Wj`7SNJ+#3pKZ<==)6#!JVcLf4&Hs~u%!06-c^1blGr z>)#sil-D>NT%Y@tgf1K%_uO2B0GPBa`@tBRO@TnU{V%l zRl@;r{}U(x1=hw^zi8h4eCK#?s6f_pwHX1x{u_Z-O-&6HZZZBocx7cJ&e>2K$B}ko zwGrjcqI@<32p?$QYtFJ)Vn%G5xpl#Um7~z8;f|LGBw9oTJ9243AS(~eG-Rl65q__uCrj%otNI|F;Ww@>L+hgtpHyj1VR9{u7Pgkcc>!h6v{SDK z^6F;U_r=oikrIqel{|ceIF)p%ZkERu$og-gLclqT;%T-dg6=mAqea^KdQ_%bumYqI z4oaO&7sE7$G_l}Gko};W1Iu&E2%T`Wc`YTV=mYTO4gWyils!0h%M0m2CU=Cl!327} zYgHTEqe+OaYPUvGDlHz{XQpBW;(Nkx??h1`J)ZD;G{hbsA(_0tZFv!DXvzSx|h6ZmB5 zL$eJNON=np8R&5Vx z8Pp^i-&WnaET0)npSX7|<>{vg{!JfTSoL!Z)B1L`(pKvd5RQIj964+JN(Sp14862Z zk_0tayjKg&Zq#pLJBwt70ps+-puSMVh!cZXbf^aS76T#}08krcN7=FKe}}ae!ccw8 z4;8``afSk=-VXJn)#Grhd?6|t3V{EG;!FRjLYCWt&B+r;jd8tQi$wG%JaCU<{RzDF BR8If^ literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_insert.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..110242bf4ae86373a30704685f5b081a0efe1bf1 GIT binary patch literal 1623 zcmaKsc~FuG6u>_|(FAEEDxk6=H7y0TY|En*6A$vhNJ%rnv%*XhJSuGYpeXagBi*e$ z%1UfEvnOV*?Y0oP90>rx zLaIB3uCdU(=;~;6lS7Cc0AM1vv$GG?*_m*d6SI#U6#)S2vW{nMb8jLW+-L2&N;g9$ zpm#pwN|Gcdf8&>{Ey#r^@{cRS5@tI0mDd1&8KC)AoW=41EA9g9^W)YgZJ zZAnRWsbfSnm!A>6HfE#D6w|h`=Vr3vjAS#ZVB8`0_grJqWd4zki+UJGPEf*BI`>(K zVE?If&&UiLPa?M4KRS%D(YK%4pIjVy)-pVZVG|R}ko$GsHRXq_Dp;kt?wVFnebA# zk?|Fq5F26M|Q8NuGwgQmvQXO{krH*fu;oj3zu8nd8l@F*LN!(T+eASJ&00*Oh$c ztr3gqlWK?KS&2pWW-Ns%@Zg&Om&>h?N=ppBE7X^gW>=YH11PL4K1lWDSgW!=lLF!! z;-S)!EP^RW5sBe>dKWPc7=JTz_DGg2J05asoC^}3cyje+yb#A=Fm#SdX@gzlJ6)(@{hIG5T;J&EsO^WP@nd6S6?gWK zZ0+pYG2eT0`1e=cwoxC*B5SXBfEuV{(u$d8Ty}2v4QdlBKk@BAH$PNt|8j4uC%7Vd zi$sc^P>xqol&hmG)>i`7IihAv(&UU6Ap-VBfjztZ7=jgVyX6`@bv)y4IVm&g6JN;jN!3EhEm4zbk|}~Qc@Dm;{~SNFQ&U& zI)2P1Qm1e@949GhM$U6WzYT=sa(T0e85BfC!|7(Zq0a3+?WLTA1QQ;Q7YA!1pq$y8 zmUFmVYfNsYVx%$y=ISEcdb<2L`ali*sJ>%v0CWw5{x#(}`MEJ+2Gt4k%z{R&F)}zp z*D(xMaTXd`xQL*K(CxK?F+C3R`Q=~ihK7btu68O(bZ@je>n$<5@iDU2^|kBHngA9{ zq7A?`m_GzgMBgvr?QV;#Ts{Sz{yYst;$#z&{d*NJ>>gdw)1-95I369Vw#Sx!+Hi%p zQh$Nqs+g+medNCnTp8GH4khIcEzd#S)5w)J+C#8-fN~Keyl`(slHc$hQ0eqJQLG4MSiJyUh1}HrYN>5)H*%JDorf1mtg^Ym4 gYt0AdAu}ft&5FXjc0KyE=HmcV7jMdq?ZLu-0p~=z>i_@% literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_merge.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5f7643a29f1e3133165d706f894e6b8e516f6d GIT binary patch literal 2970 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 D=C@7a literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_scan.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/columnstore_index_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..de030b6b4ee3f34f062047da882075ffbc523c4e GIT binary patch literal 1298 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 X;+(sFN0L<<8Gyjk)z4*}Q$iB}Vl2p9 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/compute_to_control_node.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/compute_to_control_node.png new file mode 100644 index 0000000000000000000000000000000000000000..98c0c95e14c191fa960db22db3d8eb2cd16be5f5 GIT binary patch literal 1946 zcmZux3p5nk8s0Mo(|8YsJZ9!ZCeIS?c+7+un#nT^I$p&oiSZ_t%na!aiYVnw7`cu( z9gnC?qiHd zRo(y8yUdi8JGq@|nwdT5e{{Ix-Jr@f3bANx4BN6rcO~#oyB6Hc^r$gB6NQeA^~^Q* z8Cx%M&eKxKUzW_j9iP`j5Aoft?VkW@^Ep35M7Jbsy+a(^`|xqgRgGLonFV)s zmm(~c>DtTX70~V{K$kd7le+f}L(D0!!DutHMA%}CjHb}ccHDLe!YgG9OLh(rVPeS+p0$uDnP#U{=6Gp*k;b}t-p&^JL=wTl~a zSb~|)WgH`lGl|qJa;Ma)t1&~ROY9R%;Fy31t(_ynm$YI7$`C%&`NowuI@l5m9jNTW zVPeI>_8554i|VwSA<@U?x{xdyH%w?foZ@j~c=|Rk@__4!a^La~ef8NGbVWUn7G%sX zVpofn@DYleU7VuWxmpMk_={_1cExS_Uf=ZBTLM4oFdDWCJRrz7Y8UXEZrN~HH8Xa` zd>@jzst2+qss}awMeOt3%1@XwJNyX6xOOJyTn_PY1X=E%Vn}S{a{DtVfCEPWpg`q@ zDPO>YS7J+p zH&U!TYX304QT{+HA_axs;?jJxBXu_`?^Op$5`)N*1Df`XI~0cq(GJ~S)zRk{O1L=@ zzLS@8X}(y0Xtsis&W#ovE6u-~d|&NX24w5?sVRk%C+{JZm{0dUitV9)<4EM2@pksz zlS@zMGo0LgoebZs=uom9JJLm}|NFWcJy(>Nnctc)-aEr=V2BC++5eM-q)ecCzR2;K z8?6?_Yn-}R!)3e2MR?%*8xJ?QxEd)|$`H@KyNQJ(cT8}~9JtdE<;dkqG`XsTj%(hd zK}EtgNy|7vrIcQX-^pQ3-av((w5BVFHHd*Ddx`WQocH7S>fdnvE3hO*Xt>qk>f$ zX)bNc0v(m`HJWM*8)XVG0f8|$4Qg>L_F{oQFTx^1FmveaRTgqqGezhQEbeVv@fLfd0 zQydPjvfnGLLPYxuHIk8;0^qg)_Fo_X*!w~?GYKabCnitqJl?k6YcUD=PZa==RtoXX zv-qI8)9tn^goM`}ttf?V%xs5O(HTA1EP$^L&t21p=jcj*sOrZ2{sBCR5kUGpEx&&p z_`8g=dNM=pboQ@XctUw%Fm`cUKuc!<2K;EE`_l6>4~1oo-s(>I68jm*_x7);Izu0B zhZl^9>=<*dtb6sf_0d1q`8TZM`IgTXN0%|9Yh4A!j(M`AzaWbaI^w=vIK(|4w8|oB!G7(g%ob*Patf6DK^Ml+^LHBV4JWSOk7;0K9Pc z^MHnI6pfB(5wLSB;}hp#~x3o=WVaow!#q!LOAK5plk7 z;ZhkjeB`T;;57xGD+ToudmU){R^%8)EqJ^u3-fS1pwyVj=U3TwHnjLb@BAYtDTh9| zFQrf`yX0f11`l!9IzIZd?s!0Z5Nu%8{y?mNdzYJ*FIiXkRMQc}tPRqaUItKHJW2J= H2Q&W#_v>Nz literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/concatenation.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/concatenation.png new file mode 100644 index 0000000000000000000000000000000000000000..214d68358fe742d44d83b8e5151d25ba3ede5378 GIT binary patch literal 908 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~R#a3ZROU$oFe*DdT^vIyZoR#Gc4L!)NJHS` zl&MZShooMd+^C+lfrC47b#z#oNaKX+bKmxU{Q3E8YMjc1WtmlTf6NZ@vbyxy_VE~BQFU{_2 za@XSA3(hOR#5o%JmM*q^cs%nr8+oCqBP$E9zmvv4FO#l*iS>6Bu literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/const_table_get.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/const_table_get.png new file mode 100644 index 0000000000000000000000000000000000000000..0f32261c3b7e0851f0c0980d37e200f62502c02d GIT binary patch literal 1327 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j!|FxyyxaN1_owrPZ!6Kid%2z+GpQ(kZ6Bz zYtzA9V)Bz=*%A@w&EJeGIyQ@L`VxI5_+@~{K8I^MGo9I;_d6~OX5TL2wNTdk_%ts4 zsn$~(3X`I}*4UTte=eD<`19U<;k$En=AP*^oPS>2HE_*eo0bHxuLg&%PdmU7AI+p( zlgrujVXG=!!2ie7@0|>tt^a=>moNYNFnwii_acv=rg=p_)WzlRzW*8jd`|K4_P>{e zQX;4MlqaLGdi zm+w<%XUFaNDfRa+OPuDP%^wq9m!&^$oWe2>=)eyx`{SB`R(%qxI23>WW1@W}rw!2P z3#%AH^X}ID{TBWB;r-C2@AvDk1~ornS@CJZ(Vv@{%Qx)5UhyMTbw$;mZSoeGwLAga z82C5M+gU6K7~#+k&kKlnQ1J7veCKh^^M7n ziY%u;*93+&P44!8cky4`;)nX)1-1{mO>3T8{YnmykOm zI&rP5W|dsa?uz+8+;aPY=7MkK-$jCcTUT?f`WtKeKlE1m>KE5IZiPHh>ymdecwcK2 z8#<-iuG9Iw8<>*PEeZ lb|}y-63j5KH%R?wI3b+6Zo{eNz>LJe;OXk;vd$@?2>>NKFMt35 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/constant_scan.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/constant_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..88c1354bf015d4e83a2a188caf03a2b4d5650c81 GIT binary patch literal 1114 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~R#aTo>`R*k0|Qf-r;B4q#jUq@7iL8V${hb# z?-p_<<_lMHnp)oZfR4`fHz}8e8kx=ZHSBNKZdeX6 zfeE2lfB~Jub8E+Y#-0E9{@+*=wtDd{``Y{4A96j=WMG6^kFFkOExJh-Ti%|H&B=eq zR=tm*s;{`LP&QrsdZgQ_+I^|71F0 zQr86*n5VbCtory%~!PYU5-qDzx$e?&GX0C<=5{2mt^+0SU!gFUouPVI+m4F4C)NmGnaH8_`%9n zaDu~2YX1rbK0(LK$Kv7+=QzA%_Mc!VatV0#<0#t%qozs6^{pC21gF^5ePsO7xuEUi zYK{l-N-I+TWHG%Ea`b&1F6uCwBTIV!E{1Qe0gr!#vV90)+1e*>_#vMCd+&pl{j33* zEL%UFQ-Fuvf!7SNU;h68x`PQ3nlfirWX^KuZ`Njj2Q32-I0V))<_Aa%aFi&Sf%u-T KelF{r5}E+(F2!d6 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/control_to_compute_nodes.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/control_to_compute_nodes.png new file mode 100644 index 0000000000000000000000000000000000000000..47066d9737f6453566330b64df5e8e283f135d03 GIT binary patch literal 1992 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

i6?e>%e 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 JZ)}dv{~Nc9q|yKY literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/deleted_scan.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/deleted_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..84e6c0ab96d312bb4647ae385c86016c118eb577 GIT binary patch literal 1644 zcmZXVdr;Ep8pmILkRh?Fgqjr!0h-4UTU$$PGYl_~cwJOnQ_3weYbB-7ElR*~!&_cb zkBY8sbxs#g;+#sc)?1wlt=!g2?6?*l!rYFVCYDHu9Nd|9&dhl~^W47k{PjHZ%v%@} z75)io9SQ*O35yvLXN!_$L)zK=y`X)M0Du)7VlZM@3PnDo$1GVBVwS z?(@FdT&rZL1IqgOme#G|Q{s6?^DB*nJ$ro-)8+Q&yZzxH9%zQkI zeO-Y5;-O}TSln4`pv(yK&SrWD{CYO7{>krot6Wofd8<$3Tu@eRHMwA+A$R!vs?|HQ zQ$(gx;m`Y|2fr(2XPgaSQ(S)KW`3RE$I-EL@(USNzWY-W0t8tJkK&*GxG`^^m(u5Q zN0iVpi$au=L)2H&;0L(!!D|(1#8C5R4pzy_=*kFBjh!p)Rjd@%H=A$moymN1_g^Z7 zQxUAux6Sey8X=N~J!$JM`{qs-w9q8obbUfOEPWk4c-Y4$8}aT4e2vB@@&%llBU##* z;ztfQ3^}1zj9W^&{<8AjbEr4Iz5P{C6kdWpe(M+)K1pb-!!Sl=H9w#XK(q){YKx2 zw)M>(mUO7NNd=J*T;p=RF-!Z^(0T*P0CU7zP1C<|4_;u>p`&?n{ij$|0i}RM=N~ZGC5&x2&grak6=i)THP< z(KpO?O4=G zS95;c)evwmeXC+H{qr$RtAl%B_cMR!pb3j(T>QD5e}e@sUKz<4z_1I7{W??My9Dny zO~u!t)-+CNGW@Bqq|%-Xi)>%`P)W}1l|$9eQIBuBCs4;g-)FaNeA$?O4%2@y{V|4|`pg zfMMC5f8mAxHIMjVjC0q65N_}ZbtGs-2$@PJeA2NjEjB>7P^V!SS5y>CcSsK7u9kD)Bl>>!mZ zYTM+)Fvs{VAtG;LP38cWo8rOGA|MwB)#>p?m_hHi@k1R ze<>a}C~^jr+85iMFzsb>+k8gGEMKmtJGB`AS|;sb+*dLy<%j0GZ|%1xZ)$&urL$?qwxIsb>t%(^-6zD*Tf*eS z*znW1<3C3HQIap8iDt3NqQUnQ3sqI`77*p-Vti$#dlN`A%-{Prla@v9P|x74Z_Y3v zreb5nwuWulVTF6Ghks4#Qa3%h6kU_4-zwQNgPJ~NX?~R2m5O+o+h)FRnshL`r|~6K zB)K1UVOPG`-v|?*Hr?NC}9y>iCQ*@CAN~a96-fz&k3lKSPZvH;3o;jaI1aO78n;k6eL#* z0>P9nk_Sm_Kfp3b8^5nM2hqo7lq>mv9`W)qGfQ{fc|M)Jt`_#Oc{zT3bmwl^=*0~W To?D*&wyd#2qe5DC?Unr(IEc;T literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/dynamic.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..01e92669c1ce89921f412089d0a687b3dceac816 GIT binary patch literal 1459 zcmZ8g3p5m17{2ppW|qlF!aA%WjLi%+?TQ|gXH29aj7=DdBpJrDjG7@#p6j(`G11l` zDONEaD`P3v`xWvU&yaVDk?ic)ZBJ+S-1Fc6-tYgv^Z)1G@4rQ{Hs2|sC;lVuJN!&^<5tcmSZ49G-m4qRvq1h3lCIw)-T4rEMB1 z*?3OujHW$4BC5;5>s9S!7bcf%k}^K7RW7IW$+7Tox&GYS(S4{06|AqXb*zrjYMA!I+2f)X(tXBbNX)O=@GJ5N&a`z)uV)2p*=a0GRGOt!5awyoo?)l(Fs=G ziTYM}xj{$Y^A1G2aq>9lo_Ct=1!o6+y1zrSeeZ9$8*W-fguDvt0BL``8e848G2b2L z;mGMKNOo5<+dO~~u_jKZSZekm6b#LA-D}q5vKksf4Wo;=m)6!{y%~&lfE~>j{|mz1(%ck? zwpUJdUaA=R%Fp75001O+ZyN;soTVTJk%8n>X2>atZy@s8{k@oQ0ANLAQzN_3frX)( z%ZhFa{FMep)J#XNUG5piO4NnCCOrrO)J5bd>PvUy#Eyy)k#JAt)-*5a z-PP$*CvdHryVi%7i_0Ah7bHzx8-6*Bt(U?kM5Qt+@KcNo6PfA1pW$=2KfVcK)zXR? zZl2u(3uQgtrSd#ySJ&o^jjL)$wC6Qtm3Jaw8P<88kn*akxDUwr;3~@)T{YWBuO`RF zjN01T;zgIUtn-K&Rzg(hVWwc6dj0OwX4gWn0e28?7$n3NOB?o#Me^0aoRkV&4)g~K zvHKNRPsSn*S3PJln6vqPb4`bw&J7L4aV#F4wKXoTs?w%XsVC6Cbb2+`*0Ov1@aZRC zBXb5`v{q-G8zEhP9Kl~bdVX=T^D6wAyE4{Ch`Y^8GKZBY@mIxlR6%nz28slQiX;>s zk#m??vR!{YX)WyuY9^|g&m^gAX0}WRL>EzHo(eJiwY6ZKwnKMXJtd=y9EP4+eA-LX z%Ou!|J{rtB1xxXll@b3~>%NOk%U5PL#}b*3Yn&>pDOz{JWEz*1|3uM*QZSk@5ymNL zGM9sL7~@?9Ki$9atigr1pakHBFc!b#8A+p%qBR+Tb<9_jPPV{BxsuZF+lObq&feH; z7j!HnVCcm4gAFCiIkB{CZCEB1mf(Uq`F4UeSc3*)#j?P*C{f~LOfRI%1xF#=ZO>!C zJmoAsa5FAAPKh3W`5-XFL8IwfKpCa*d<^Ir@s|mZVyTEc+%2>K3T$@ymC;qfusFyD zfvPki0@g1JspA2Dr5G{;_ta=YIViJtI4E YoJ+1RA3Z>I6HhZBn^~JaF{VZQ1*jNz00000 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_broadcast.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_broadcast.png new file mode 100644 index 0000000000000000000000000000000000000000..373f0180292f40f9d9fff83d94131ab58c71a364 GIT binary patch literal 2538 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 MJAvrZ?i4}&56btGSpWb4 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_export.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_export.png new file mode 100644 index 0000000000000000000000000000000000000000..7533114847112f622d10ff6d35e86f58b63b8101 GIT binary patch literal 1707 zcmaKsdobJS8pnURlqAHh+8R{DhPs8yIkmd0LcQ;nUs~LNky9z$C)!b=a2Kg^StkOzVpuKnfG~Sp8PIFRxthdiAcxM%2&&-_)jeS0}Jf-_1*|U6c(Ykl1>Bh14?|NOte~4@m z%srUIL`s3fkwsPcp+Y0wV&$J77M4Ej#t5GH@BjW05OU|*QCF*TG`mxx9Uj`|*CNMB z7=UymkyWvSUNcd$8m}UouqD$gt~p%@r`-AD)WG;Zooq6JWb$aRCc3hcxi( z-UvL_XKmULwN3Qp+JKGb$9d>bNKeljH_9GRJN4cVFjG_LH^g5frRiy5bgHW1{3khV zraEN;z=$~NzG$5C^YH>yo4bj}zOHtVNu+QZ0BCLB3VKjTH9vZB9#T zYiqU=Ri_w5k(lebQIYWBw>Snt(Qm1TXzYPQUr8$on9KzO#FdE?(6Iv>BSSU^v!&Gz zR@rw8a?J?Aiku~yg~f{mx?shvEhMHo;xMN7YBoCT|8f|s8Ge}mNj6voUy=9R==nAr zn!hTQ%0{bnG}#q(TJTBJuLXBn?#_!8{rUzZ%B#WjuFCrXgC;+h6H<_>*tDEa-77JP zv*+pU*wW15sNjW$>+r6zS6mmrkBQlKVTza7(g2-7A(}J&3AM*W6N%mY;Qrgpw3)DY z-9Zlg)~K%+wsm<9wp?vKHy3&H=6unMkqJAG1_=8`x#_5WJ00x8a`2fU$OJ86l^?&^ zK%jrQ67I~R3XGaK@Kl!jVd#mGy%xu5AlYS}x_Wq4IgG|-u+To}4P!_cg zAX-im*&Pmz`L9gqCcoe9NeVy<-(`Spr05idx7H*a>8~qHha^<;S*sm-d~aj|QfLfG zDCf7Wb{OytkyFJ(-K!njF*v~H>;>ldt<$F!p{RX!!0w`KsZj!2cpQ?bA$rg``COrH zW$j4MaUl2+-1#b%2LMn20bl@Y|My}@je`Ebsy^zUu&9qfFZ|y=xb@&z(0b0byUOK~ zn8A0i=Nw~Yh6B9ItPBA3+ng_32oPwpjr)=X*2})v5^6d!e|7b$kmcu@@zy~zfS?{c z036WU5``Hc{_!QVNZEs|dD%1AUo&C;3j8nmKcdQ05)W0*gAJYB-!_EoJB7aS?)~D} z4z6+|CP-Z3RRNI`e^iuNgHBtNB@IR@Z^z%Ln1{T98MA17wcwMlp#AtuaeSj@6@~3P zXGuOpE}tA58*|UrWrD-|TJ~vcJztEB5?c~l#U@4GhNDjCt0MwQrjTu2z$xlX8Pzjc}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j?s*_&1HTv0|T?Gr;B4q#jUq@H|9NZ5NUmQ z`VbrEc9EOY?ED>1?@rMS+?K37J?CEQwe?K_mo7EAFr=<_@ncEZl)V0V(Z67K&WAPo zZaki7sN5pp)R7dmhqdr#j+y?v`2XfwSNIqh9ANOurH^&8(zD~%hrfUR+rX;=oI*W6`G^^9>4HZ8b1oY(@9zA7t*i*w` zp8@PEeg<-c>mRi^9f_g?z`74S)Rry zF`Z*PBFNw%!^i-ogxn|m0mkId9N7nVYODDBySroA6PY^vnHV~h85%6msCoPXjS3}m zfyKcKE5|^Qw6y6j_t$XiTJGX^XK@L>%LE(y}N23MA_2YRDvnVhiL14P) cn0PjR+t*{-l8ph~z&ys_>FVdQ&MBb@0Mx8Pr2qf` literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_round_robin.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_round_robin.png new file mode 100644 index 0000000000000000000000000000000000000000..b0202d4ff1225e3712e1a22112391c6a262932a1 GIT binary patch literal 1965 zcmZWq3p5n!7XD|9G2WxRj>LFP$SY?Oj@KAs4nyT#p+q8&kinoCE&X3ZGHhs2l7u$65Q5HA5+RU(G#U|!Pv3AD#%|y;^$z8Uw{=|*ExS`W& zp_zHE;rZsS28t8DQD?kOJ!kMUS$D#(8wdM)n@7iZ_j~>RbRYS&F4M5O%`FZYW1yL) z?a*5jBogAAHTt5u7=E9XN=8vXH^ev?ep7Ww!cfDvWm(PJz7&q@6 zkb)7@4!>?@6-2hjK-cMM`yak%a?%#uhtC@t#=^cuh$wLl3GYOV5-9wA{-)Ya%Omm< zqSHH9I`zc9O+uf0wY1FJxT#a5;+rmtsH#G>9A5>jBqsPIM+AXAzWWKP}0J5&p6gnDEt-WGRF zGou}u-tV=CbMLAK5*l80UA#S_(Ah^d*}QA`&DVi9Zwh!V*L3_gJJ)EmLye7E1^W7g zk;%#r%4g(ZX-;K&{SABNhKTLf>mAw7{k(uutMNXr9P}1%>*n!?C1LyqY;{e&0NQVQFcJOy&{WIlQ&nDc(<_lzmzof?$E1+|b^^w z;@|Tc{B8C?!g6+2k#^-$;umjel-7p321>L3)^slKlEvnB!PF&uU@D(Bcq5RrXj}a^ zi4dcz{!rYTq2TZDk0X)Xg$0C?LEE)w@7F&~35cv|mp)KIby zquBa0U}K-PSE1>=4=ZFfL?Tx_7+fHe14)LcoICb_)Df_dv^75Nr{SqzUFuYxM60l} zT!U2&Wp$a%T}oBX6qe+VI*5a(C{*FoMN15wt(T)&U&8zx5ANY82$=r06L4yI`JR(9 z^?N{tM(=qjx2P@xf&4)RCEOG+0FbRmMCAS1%oCT1y_onjSz+xpw1>eh#|^)Z4pc#c z20kUjQX70X>=mPA;^iqj4l}D4oFHR7Ih0s9Kma=*F!x8VVqVoKXv4_+%R=CV3FOFE4^Us;Xc9~sKu2yHHB&h+UBTwiQ2EWk}))R4Zh39k7w!$s!v2O~gj>L#p?ZK44wy{=|f_F_;=JIJ$D~;o>VJ>5bSiT0o zoS-uJw3?(*?ARe=Erik5TF4Eu$}g7f-MD!=yfPxecYY=E8#|cBY}b*eG2iYwxfa;} z^X)IFzslI7-a=)IlY_*o;~qp`!-u+aKUX{w7@vC`_CEi}Bs9@Vbxv$2-%+wjtagg8shyjc3rtk;CA$8qw_&y(iiTrL z=O(7Wlj_~{{&scxlA4FY<1{fJrrn`M| zA6~G?Z%d|V<3BDh7bU;j&(O)bQL1-h=f{fl+b+wItL%%?)Tq9eQQMINh$rZ&!va?f zqJc5nFk1gwb@x4X-d;!3kA zXqmJn0VxRb`>*&Pw~#CuJ77!}oJRZ)3hchtiJYD9aku515D n68m!(OHHOy?Ek_5V0u^`q#Ji+9_~rE0>XoLbaSY;KSli)TrPKt literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_shuffle.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/external_shuffle.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7c24cfab2a593e6434afc93d2112d8eeaf9832 GIT binary patch literal 2564 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 O+Q7z&O8(8#hyFKFZ)*Mk literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/filter.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..af726e9068303fdc0e50aa465588b118f16d4f4c GIT binary patch literal 980 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~R#aMclXKxJU{qf4ba4!+xb^n#ZeM0ck+zGb zx1?ekUEj=*GP~I&u<&;wuZW}KU|?xrcyaQ_8^+5fmP?Pk`@UNmDk#9f1XjUuKoF)5CIr;v5c~L&{)acu z&)vLs>Hh5k<{x4W3{dI$%rY;({@whgvA%ZCPDUg>ACmXYJ1tjs@*yz!=Thh1G)Ib)>q34^*>+Z%5xoiM6fb)IpP%Y@87 zA&e;<3b%i}Wa^M{JoYh|O~9~e&Ew^~3PCJ0kNe9yv~XP>OS-m5k2ce!x+M=a|H>4Q@Jg3u5FhZ&N;914>2{Vi_Ye_hUukV^R_lkoEY v`s2LtaADjqJ2?C8Ly0@^a2H?zfu%LfMmg8j}1`U0Ss6`N&f(_td@;_T^iM`cU|&VglLteTwqS;0w_ zkvQla@V0$sQ1~|4JbP+Nv1z~5mg__PCcQ87Y-Kb<1|Jk;o2uqGwVQ30CMle;x%72% z`s-o*P|wMqk97j4x^#+xf*(!An=NjNl}-2PwdoxaolC?Tbd4Cs#I&R>tA3-!X9URy zYcYu;{aO=$B#)$2=#q+8j6(DCUSuf6F0SFfGCkfC={b^klp zpmWYzlqvF5@|_F0>OStydcmR2Jx;?Lsw8uVcvCFaAIR!^sUU)Bc5r#cAJ|9?i?j!+#1ZaQ*cwhpc+#&VN zgsQ44=MU^CgHCy60RK07@C?fJhe69iIRF0u-unGFQ-rdx4LUw%Hs8lGeY8HR4Z?B2 z;@;@pP=JTHCU`Wnc5WW$)6GH9allvMf!Tmc^I}6qbaaV?k%v5S;Dy`B`}WcHxpHZ- zIa;h5?s?p9b`Y$UqgbDSU8$F4X`DU8_{S0JE0ykD;Jyns@r1PsZ8h!IEiOGcRB_CI zr?|L(b#svwcUXF?XCWjH_0H4nf_R}3N9=rS6Wh^37sZbdC69U&A6OP_^Bsq4)s##lGyMit&UN${$(Ck+u z%loM2X}*{;l)^Q~-tg>NKg9>?zkIGy+K?pBq6)55_e zjS}BhU9>EbQ2dkT75Rd~JOWZmXa&NTM*uK|1CSmP;MKrl?iVW&z>MK>dpJ~UNT*iL z`(;u3ZdQYQbu8crA|S5Nb(lt*D|J?NRkLlvF76#n>Hz0UUaS((XqzT6*8HE4k!!*t}U;V4T()W@Sqh*UdzfGcvJe$LH!G-xNu8-^eMQ z(HY=l5F6E5g{3q4CINMhy2fOXsRw3|7=(#!*=L=Bw=rRGQ3Ug-MmJHEB@PdRAG@&g zh$SGVD}!bUmAnDIU8sE)#EnKd2mrj9CeJ*V6CP!ZTVRR zigx+OPV=AKS`suW=>;^5Lj;*yzY&P`TRC>NcwZS_Cpt)F4^V`c0%A41;s@a@0UxZ1 zt*5&@P17jJ(mem{>JzHn%Cf--V2U%2min3AnevuFDo8}vV$4&!jp`tqE@Y*laWpWy zb>j*5B^>w6fNv#-zbqp~nL`wYt`{8V6c%jrMdyPnRJKzK@1_CS($=Ed%#-mq+aPop literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/get.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/get.png new file mode 100644 index 0000000000000000000000000000000000000000..79e832f23e0b05844f5059e3548fc25b2685ff03 GIT binary patch literal 1313 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j?r3gV()|)1_owXPZ!6Kid%2*8s^XV|)sBL@Q3@VN2@8GmIcNy#W;W;+*P;m~6JQ{e2m8J*THNox}pdW-F9xS}bm zwJ0p>pc&h~^Y1_VtnHd}j5o> z%wzla#xIew|5c)B9=`tjzIAsERtny^ryr!qaG-wH`RASS)y1LyHkaOieBIeUm(6i) zkXPv&ljke=9Au6g&Gjpm)qMLSvoC)2lqc)zHQ%~z+Wz%riB_Qu^MeqMO?~s9{BV`H zf9v=G8vz-sf9oELr`D|AFHpkKwCC9W>mR#K_H{hHFS=)M!QDLbj~@5y|4ix6kAM1a zXHNhAzr}*bw#zw)v3MRo*`<)F*OUKMSK;;B18p&q_azzh6bmwImNV>VII#8OT;>F0 zCh_CtLJhqfF|zj~8O#(5Dr=TA-e@@R^<(i*s{;uJ6AXCHR|%bd8Z_(dGf(?xSz9Mn z?bUny@yD9yc2d3PxD|K~&$X`zxYDFBL4jkAJ^$4G@(m0Q3lYA>Jdp2?X%TUM-az4bNf>5yYhJGZ& W0>+rVM_vK*4uhwwpUXO@geCw~aW7c_ literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/group_by_aggregate.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/group_by_aggregate.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb1bf9e9c9f00e1a5aef0c78c35c26b20d766e3 GIT binary patch literal 1615 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/if.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/if.png new file mode 100644 index 0000000000000000000000000000000000000000..0aedbcb369e6b00f7855058f60e7adf17b265180 GIT binary patch literal 4548 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_insert.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..723e71a571e1ea08f8bf0782c3d39467f1e25b1b GIT binary patch literal 2138 zcma)7cT^Kd6W@dgAq0t11VxG>AR!#&H1rmVAcO;qp-8WW-lFt`Dj;1^X#xidDiRcF zauoFxBqBv1B2U5*hyo%Aq98&p-re{8aev*LH#6`3c6Mjy{dQ+EZEa2nBlaTz0K%3Q zruIBf`=M}to_%8A$p8S7Mm90AwKOr23yTQ#BM12cpj?nppl|WSNcyS!sT=kxh;t~r zKHGBDjI8&Hr&W{FMo4GJ9?g!3R9Tu7&deycNl1Tptk-GNT3nb`fhWt#g@o8-soBqP z3-K2vMRK=3eVk%{JSaEHus*K)44iJtCh95rMWVf?#f_2j*={c^UW|&)ry=!vnfmeZ zoflVCmm{gUAxA>7JxY5Av2PnQn3=UWO!=BY__ZR1w2iXp(MqAch7qpkHgh6}J(K*? zbF2e$wX9VoCLKe(Nm$~HMsBqOoNeZTY zbzXeFju|7j3%m}QZE1*bY3yGLtrVI3lG+@*B*gPiDcncPAp?(pZz~ncf|UQ%vaNxH zol7zwXz9)i?g)o&R3xGA&e2Dc=6@Lp#9$&|pM&`JF)@TGKDG0-9VJ(+!im*aVu)SS z+u2=51wOxpK04jn$}zB!r6DQJQGC+U(8Ff^Zfnu!9pXZ{*U4YL@{Jcq3y=$ty6u&%UA{+WbTQmNWp{Djf#m-iDCfw%PF60^vN=)Z-Bqwqa`O`C(AHb^)g=kD_$a^ahJw_G({Hu&hC~fu84s5aKhoR&LRN0O(tjp3ySb*caxv*Ad5I zjO-ZPAS3W_X6d`nkbFYl!Zl^|;$xqoP2@^cOXwX{h|wWn0Rx%fEU9|9uHZh5b{9Ct zz*Vd|dao3X5x@f@V-#(9tBA4Lzy*b9!~U!5nOmJ2jE8T z2bSW=M^No>0Hv9Nd^p%^L#C?rjK9(*+?wBra!<46uay61<)6C>7Cm51sC3x4(V1Zh z352_DhbGd+oCV~DQU9w&ZVym^(ugJ`mS}WhqT7~ETSF>JpkfofMY!rCa?_Syy&jvQ zp@%$a!Ylmm;JHKwa9*!@%@~k_~tIbEIx|_x$HfwkA zD}!U{p%0h~L4m>G!#Uk*hbmILx)l{k9T86EZ#aFDK za$kR;7KeZKcmhUuWZcsia0zyU3C5(Wf3Ip5L-mcwtEH*qG;^5#g z9dmte)K)BQez0RXWfBwAdIkW=-51oQcQ@C>Pq5_U+`0EyOMzD3 zb08koUvI%!VjwuPdzfM5%C>(+@yK#toQUmo>-9POe*ahNc`>$s?Fc+rlS^bTmjuAd zy}d-Q#yHMs>YQEQ+IH?t(jXm;K5(f~h4MPL`?!>cd+2LsboRZ@4(D7!=XGZn=EDmC zIxXVVK!~zXy>ga-t9L18ZE@5WyF=OyQRy@}v7$oOW?AYlIf2o zmfVy}4eN}tkp&Z}^|_h%@8guN!+Hwd1mSWnANjk@@P6Asz_I|JElYv8o|UxgLMmOOHtM$ zHPj^fL(~P60y(-uG(ot_F%}s_5sO?=m1MI8`B27NAjQKB*o$Y literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_scan.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..e373d6c8834daece5ea1d89b26618224f44e5db0 GIT binary patch literal 2188 zcmX|B2{;tm7r(P)CPswt!e=ZGm8E1$wn8XGA(W;(OSVC_Q4?b%Ys!}FTcs=!$rfX4 z5%V9$Xp*%FW0&2$vApq?|98K0&v(!Lo%4O?-rxDfT3MR#av$af0Pvcb8eQUe!k!_y zID5O^%`N~SQ67edR%V8VXusROZXVvQ04OBgOVTxMHxU1Tx%~XnQSM-V>(5p>iZO9h za<+=ZD5~A9{?>6SUxArnGJ~N|CoH~YU#4BBH9IqQ6iJjsW3iTT%9j|s$!Ft5`4ZVn z3nM=lB+#@jbM@07fo*kyjgFjKz%l2sLuXJ@3D>(#yJ>>cQ7D~HbX`2YDSlaTF(5n< z`@64di@X3ub+|Hy9$T!Tl(VAe|1?cDYBL*0%jXf$zwH#vdKl1qGs6ABLvznWEptWT zL3`{UcB(cEGe%6IXR3;elbx2Yzg?H@*Z1<_Hx(+Bit8-{`27{7BV>&}zjTJV+Q(2! zlANWD*(dmR2|q6;Uy!47iJqFYj^OTGirj5o#FE=O>av95AUP`Uwojno!4c=k??{h) z8vUW0c@f9TCn{(W(-)~;N=moktKKjXx{}2ROgV(GBk!atYqH!Y#Jz89JE8dqVs#kW zYFk@7sb?ukKn2wV!ovft0tApig#!99b3%xqCk5D{o*VT_pImN+ECEyrj2gp(L!W^~2|_kBL+qL-M7 z=tqnX%IWPhC0*R*JDm(UTIGXHDm8m!DxRv+g9p=|D58~>LGyWxRLITa<5f(909E_3 zsE@?^Pp!Azlw1on1YY7kc;E)}U$xt-EqQ|)+X6<74`;(1*`C^$ACSBH=>{fjy zGu3rK{a|l@e?OJ3OOcV59^I(9XVU-OuOR6Ztu%p>M#?2&H)9@w!m+&P;l=AYCNnVXoH(B^}W zpbXt|G{*Or<#3Itk@}{~)WWS(I`3=e9Iz<9EE1Nvh9DH{FRa~B%OclxWs}`#vuoL+ zJob_hs@g=ua=I~5&Eg=$T*S-3?vv41cOOxdqa*~IxNdt-7#IKm1^l3=R4cItFAQFK z60Quvb7|OqO4SS(;8HLXh%0=#$}ChU*~bU0WOL^ohq38I^qBHVBy=XY@$BCql;L3% z*R>>coHWOGe?S|7$d2lxA`hf^qYd30+J8Lm!e0$WT@{4b9Qf=ly5)c%eA)T-!iQn^ z5Mp!Rbr36jMy|(y|FFP%`>@K>MTZTing$YS3V9znR>vU;0RT8abEX_1LqV*zuI}^5 zNLW$$hWL!`fBG z(yDp>EOTAS%McqTWGrOddmd@?R`S)24~}a3R}R8K%k7mQLjX|6G4gOK#3~e<7hAun zl~~`6;fjb0;PLY131_WS+A<81Wz!HRUH>=VRW;|>Uxx0gn#JF(V}?c*Ey93M?9N*TiiWXyx<5| zd0f^yraJ#u=sbEwU4+8Jw|Jw{JN&)=9mAp& zp2IoUwh+WG%^0mcUQl_B$G7D5EvQPY|C(7`TMUs2xn*S#MQXv3-@uYLK$e zvZ*9b&fagq0Ub&;qt5OLs{#GXoHR3g0B7^sn5K?Fz;hFiHB8lP#W9;^94;5CPP-)K zm3uaOB2!^w>@XS4%}M>y4Y9(@r6pgbjWR0)h&7{pEwF^L8f3;~DX}G%SE__AZIn>~ zCGv`)uo_vsc17*SpZ)Mt@K!pT#){|XUn+jcTw$qGv^?9NlxAy+sInj3n|9a4f;@Y<>VG}q0j{`BS& zk|Q}9S>y-Z#Uc9l^p5!G&1&2!4EL>7;c4w-rhMVI&p~{yPE`F8_O`K8f*MM$fVTSV z3hRC!E)$o?F@;aOn#7kE+&bDRrj9c&ac=HjPIp3C4j+C}pcFf@ z`)0{RfbYvz^#v?_9}w4+1X@@<;5UQ^V|6Uh;=ckR{G7bd2~)gFfV;e4#el>tzQ17{ tz4%uTijHpQn&1@ literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_seek.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_seek.png new file mode 100644 index 0000000000000000000000000000000000000000..093805cddf60e777fa20add73a0aba6468ec738b GIT binary patch literal 3583 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 FV1mXq%D4ak literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_spool.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/index_spool.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0fa8f620878634862adc402d9d244574dd23c3 GIT binary patch literal 2675 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/intrinsic.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/intrinsic.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5b614ed4b31e6c51ab59b89559e073151f865f GIT binary patch literal 1973 zcmYk63p~^78^C`vmzg;&c0$MPL@pUdrTNR;tu4)6=5$evhRv;9iVP_fM>w|XFHU<_dF+G6 zz};WEl_JwKKk9iSQ_^~U&i&Cg)w|;k&Vey8VbHisebe{Re;U!Ve~#^gq-beVsf0`u zj|nlu{<`XpY~kYPk;%^*+WkD2gH|1Y_fxvpVZESeqqAe*+rfUMpXxl)*{?j420P3h zuue#Letii!ADxs<-5YM+s;|^-KKvwoAcJXPTq?js-Yn2fTfY_8U#_5J6Lm6XBP+V+ zOmgtmESHdMv4OfB^x=8GZPrgZV^C|%{EZL|k3{ZC z)^&V&|16l~o8J2%_v{`gq1g^GZPJx-RBu35)$)UTGW6AAs<>^Q+SUHw#u7v(sMNH6 z%M2zRlkD78&%Qx<7AduUJK3n_eQkg8jB9VGv2m32au`@;!1&k**d&%F(m!dgi(TqN zKxM|Z=q-kF%fnJ_-VF^OFa#|c>;mgNSY2I8$LaS|g1Fe@m%_zm$D_~71G^cYk?u(MTB-F`ah{+*a= zhpfb~dE?JN!)`jcO_|2uW|Wi)emPjglG6E4pq&%RHmuC5|uOujuHXjik?O7c}D88o(lTDvgt?W7XVe|@oAyKPr+8ayTXQuvL549op z9$8eJuT)RbfjQhIXQE)^O(rgVQ%Y`n@8&H0YJ4#3g{1NEaZp!~GLF%Cfuy&+Ps>dI^rq8u4|xptr=z6(W9 zXk`W`z@?F3Ug2B=f3AIYJ~dVS}^G5G*fCS0Oqk%}xxYO~;3Z|Kd&)XH-Bq z;|sh{=Sp`It}CO(AXB>v>6ojFdlSN15Q#8(G=iS;(C~1i{QtZ<*hqT_rTX~8Kj6}! zgwbnfRNoQHoN{K`*iB8vYMb=MxX!))o`Jy%*Em1=)f8H6gj$rmyQIjmg-id2csy&5 z&kzU%?X0cKS}H0kaQmr(t0sd(UhOy##!MCVYps@+R`+x6fi8RBL&uao@Dy`3uG!&k z&dSO`Ny&Hf(HP8C_#T@yifV^5o&YV!$zIshRTCU`HEQ)o*-9Fh<=oiZd`s=)vH3?H zG()|-j2Pp3q=J2VIQuq*kAhV$lo8DhtA;KHkVzn)M5_PKuUEQ{O0%J2o?|i!#){{> zcp>wHoe(ZMJ~&hqTT9{FWbQ-wb9UN7>UvinlZ&4qj|!iDAc+zF*V@J5x+K9!z^NB@ zp!!xmpI>`TOpo7hogDym>sSikJ)F##3Gp{Ca-*Fz5TBCy0sOlUfDM@Wjqy+eIeWu`Q+JQR2H118eQ_74P`i}pgm3qCkO{#NO~`nyGL%n zFx=ja??bpFy26yXk#rPnaecjU)g!mG)pBPmif+ndk4K~ng~DcDFmabU_tl!fnAbix zH`i%hHcckY#yopM`9abJ!!!aDJi2zMS06n!W<-IU%HLu)H+TLT$DNEU!v>~`;{gq> zU5!tlCYsFhi|6~|E!V~%(KN*x@paAl-Z{0viI1{2I(%r^TG?rel_%|Bd1yy}2rF%n zZDMooz-~y&81D^*Z$YI}p##2!Y0i~(J#Dp{N;&tc>o={etbU5CofqbK*c;099bgwg z`1M)S)4{s96kXgH`t{rIN;IQZRf5I8q*hx&mNdfnBVPgn3y4zZL${{sCm?l;@Ma2L z3shlX-@xzMzx60wGOBho$@Dfwiwm-WLBpXLbJOgAyJSD~`o_k&T{^b%l1XERGfzKj zX?e{ER2M?tg6#e#a)tr8-p1e>}z59DXv_6&Uo75A%)IP<#Mq(na4r@hskAY zIfK4v5dAA!Zh}AU*rc9u{z@VKE6{`0#DDL?WIun8`bwaGP*hFO@-IaSyiKovfn%{) zxxW*A1FLPGJKQwbGs1Fb9H;$=9;~$-kPKdgI0oo6Y^3>X)72<4WIRa!^MkrSETJ=`@VkE8#hS Mb0RoCw)ao@3r}Bwpa1{> literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/iterator_catch_all.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/iterator_catch_all.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2d728d680db33ac8ede1276d465b549f188fcd GIT binary patch literal 843 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~RzykV5rdpQFe=?WT^vIyZoR#Gk@K*Eh{MHY zDYE8;is}W5>DBvRa_Fv5xmLU{TC*rHsZ~a>aPN(4w?#M@7!?>;8W;o^tS$G~Dm>4b zCUz}qGZR#d$${Zd4c~>|b56$WeQpxQ5X}G-L1!^{Tp=Z%12g%NUzM7A9ERzG@_V79)~F*{hq8%Ma_FYH@K4u_zccvoxd5z zzyk6S6S~0-(k1uVXVm)3Ya`?i7`VH{EIY`B(6FJEf8{2*2!ly?_!)q})78&qol`;+ E0LRiPX#fBK literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/join.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/join.png new file mode 100644 index 0000000000000000000000000000000000000000..aefe5b4451958d60026411d1b30cf12140520485 GIT binary patch literal 1124 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/language_construct_catch_all.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/language_construct_catch_all.png new file mode 100644 index 0000000000000000000000000000000000000000..2d247ce75a4aa86329f2da02596785eef6645e96 GIT binary patch literal 1880 zcmah}c{JMz7yZQ&DXCIhYWXbHl9tv|%7+M%617W=R;{UaNW~KS(nirSu?=H7C8}Xc zXcV=jrM4CwjZ|$hN;HQOos32;4NdXsf8T%e-nsXkbI*I{{c+E^KYMvNAC^^@1pweM z#>L6!V3NNB0zTlEh)@;)fN~;GC@%~Or4thueJ$cfH~<(HXB6AHyhLga2K(0doRUpc z@cz^5zELh^N4jkt_VDt*j>+P<2$ zOHc34TQ?GtZWR(wM4R;)933^|Hs?(HzUqrH@FpQ*knw9=0Q@3HPXw} zclxs~OfuX*cl=Rtm>ybedSsux=vi{{zwQ&ZwN`gPDoa?%fJ(fgGVUqq6evba$|hgWyt z3pnhevlFoYy=mR_Uk{W+F)o)#03fII9U!2*0(KzE#ADpiGE1^r%0@Py^AK17kj7%1 z9I(mnR_BaM7Ht*4y!pqO2=Wn{Kh5dUL{8_W%K~-4}Hu9 zE-Nq?j*gnG+_l5!tL8}$#=7MVhP`c{7HrK}(D&vLLGbe5e6Z6Ad}KDbC^whnap~^X zS35iuUgJXGo`z9tt@o_meHSWxmC;31P^J6CIV^5!AF&e9%<;kDy210#t{5NJ*Dd*0 zdfZw9oC)q!_VQ;lq~@!5E6r4P zmCx(e2SQOAWpR6XKLs8h<28P6OEuUP-oi=EW4=Fj^6C?R1$=(C!u7#6PI((={$qWF z`YF~rv5dD^_TXksX%g~G293C<;`j@v(;U*!j=dWmbK=+Vvh#l}TAkD#`1~InE&<%Y zDgV0@A*UnNm(w4lWaq@dPDL05zP9)bjhncYLR zM+w*_6&ns&x5^bM)hn7Gye^=Cxq3QJW1weO;=NFOo8Bm(swNZkAb_+Zy7ymPN^QAUg;q_f?y_qS%OjRaT)DbOkul=d zQ4hQ_y0jL4NY@3fQX!h{sIeW5V9shaX`shu$N_}m%Qhc*+mvo=NnTArzqfL+!fpAV zP%)9)-2%Q`b3J3DaYP9{W)$!-S`i5JMb&{8TZ*GoEW@cC5$e%QMT@?}=8oRV^IE9s zJ6nfeltx_+HgTW1k-Dv}!)n1;{xCGhB$#k%F>h=HU{U9ea@Ge%#Z4U&4CrF(o0Yu&&_` z1jJx$`tKwO&s|slNON*_k@1T9w_LckEt-gGZRcQV5z-Gf57kI*!I4vR2cjDZ6ab@=JO`y3aj0u#= z5KQ=}uVz*s)0kRf%^x_p+m*{u%n=`@)J8n#zG7cP&8{YX$pG}K?Sq4Zw`<>)Wq*}v zlrQU2$_4I~37xhg?v}S6&jphEbXG{6$3SZzN`3l!K=_fgUz9;>dTpG3CAUVU6xJDC n2_8Gt2KIlM^zX3-0BevvNj!WK&NLxj|GtkwdpI>ZhTQ%iK?YLz literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/locate.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/locate.png new file mode 100644 index 0000000000000000000000000000000000000000..5cba66792e0e7aa48966202c900a3d4fb3613fb0 GIT binary patch literal 2686 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/log_row_scan.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/log_row_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe7875f3dd0b25d6d22d260fef96f7bba5345d8 GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/nested_loops.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/nested_loops.png new file mode 100644 index 0000000000000000000000000000000000000000..89f6c764cef905e65592107cff397445b3b29e41 GIT binary patch literal 1419 zcmY*Z3p5jI9RJ3!(Aj80%{7luCel&s!93emLPB-Rvqq8U z!iqd@*CS%5ZK%Z9WVynfCG*Oidvm&-@BF{-e82zi_kG_vzu);Tdbr`&s%}sP0IVev zoIT|$b){g+^7*A*U?%{O^fOLQ9z-W6bW}`a@R_qD0L=0)-1UXx(5dC-uSgStVE-)q8a{<^Vr^}TI1m1sV2vI;32*5V#N-NVyRv9wL;@`88d-jrlyID@r|3yCBF%zg=FNq zhBC0OnDzZfBTo8QdkKj``mN9_mZyAuu#wR|o!-6mrj$T4mPN%gH!>m`V@NZ0ZoeC( zNIFXA-pda%bXnL2U#5!O3l5m{DeLSSJw#J|B}rRuo{H%D<4^VtWEP~@vSw+UIy8>9 zudAjpFT5^VK~_pLzyFcNr;WLD!z?UfpkK}^YWGV0gspV+|`$yG$P2$ZPPAanuhNH&ruQo`Gvg(XC^7fE$@LfyuGlQ0v zeHvLvcPTSg@!yU9$xa0Wbgs3IIX{ z_6FYDm$a+&lZOx0yseEt&V>AEfimu-BJx7XexCXH()8`%>URl11H>#Od2&3g)}Qh) z`swC3F=^ZF@8$|Mer9xxx8R?!a8XNk(2yTeKxM-Nto>#=y7Jpsj*>qHiJ>+}8K(`? z@wUz&ZI}?psC!KQFtgr)o40AKZSWWWJ)j4kO=!b4=6qbV{;Da*%lmd+_7lHuC)~+n z=`~?Q6>}MAy%1&&iJ4QKcWPet9)i>r?1c8U5qY}`#zbK%WhayU5w08X;(ry?Ziz46 zDjcO}RAko>2TWSyb(>l4xC+MMQ^ti7mi{tFEQo_#LkYa0l}TY8k)rN2^q6UfD4V`F zVa}tZJ~0$-uPdsf2N>LYC9R$K0DC+y8BTg2IWpV(`2yTyR3=TeKSIjEX;E_}VhGJ$ zBv{ilD!XZ9Mqa!KPUzsgprkyC8ufrEGoz_hwiB?iDQ2*G_yim=;(rA zTcvCT3;pK%jmkxqy*+~1D=H3^?=CG(XhoMFL$IwI=meXrTUihCgLNCLM0Kf6R3JLQ(?KMXRtP zV~j9XdM;#MMnZo&_gvFrCsU7NNUevtj`sh(Z1fiUKK7d+QOvXN>4eM;@D~6YhLU?N zPXZOleFw17Cq*TvD+f(skE%FoR!fOWtsKByqtFPI_gCZjJs_*w5-+t09CJo`zWXP} zEM)Ojb>9G4`M)@=u$7=g63=2hc4PtM{WeKT>6(Y&O2wM1iCdu*dJPMvTc*@T)c=nr a@^CDxYyQuN+4A2N0HTYV^8?3#)PDeyrDa6` literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/parallelism.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/parallelism.png new file mode 100644 index 0000000000000000000000000000000000000000..45d28d806eff8bfd9ebd12c67ff28b46e110d548 GIT binary patch literal 1558 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 G=lu=m*i7mG literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/predict.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/predict.png new file mode 100644 index 0000000000000000000000000000000000000000..deb2b30934232ed9305f3858009c5f2eda0f33ce GIT binary patch literal 5193 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/project.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/project.png new file mode 100644 index 0000000000000000000000000000000000000000..be9d1765b462b1815a6bfb761070085aa66e16b8 GIT binary patch literal 783 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j)_gX({qvuFed z)Bm_=+qw#twpE=U?&V0#n!hVShZU&T!nL;}ljr%a9tQ>v21W%2mIek3&uH5V)#gj( zrIT;K1qB$GfGQjq+`vj8JO)N6=Xcgk=CJSQD#O3+=9NC64HpM#p%JG)<0kW_|Lc#l nA*}e}1M-R)1Kd^yAUF_~_gIF%ThX>=3W)3J>gTe~DWM4fKL-lA literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/rank.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/rank.png new file mode 100644 index 0000000000000000000000000000000000000000..008459045f2de635b0ac3907953dd74774a1749a GIT binary patch literal 1475 zcmZvbcTf{%6u`eEm>@$eh(?VyLSzVG#G-))3__3qVaXCMG8AM(*p!t(p%4Kj3Mq%U#p5YGIf(k?a9`&Meqo+_N;LjB+TY)tsbxC%u1eL|ihA?l{WMiM2F9?n z(hcVBklc4K!%dE~sVTKXpRiz=Dh$Js+S67Hv96Vboff|T>*sAx?i^r33e+EOX-bHM zF^pb6Zoc8yK!Xa37%J?k>H)@_MV}8A8zl117j|eEOL+rR3#V@@QgN6ItNjPW_HegS zo0Jjn#-J^>b#>Ev=Evz0p|v3}6bdR&dU<&*BHTVIV5iXQ{Rh}kZV(5cxs^gMa5vKn zhG1ux;>LHMlxe0M1kky9F^r~pe`30 zbF<@vw&$H!iyJ?MarF8cU%0Kv^<3KS5fKGnp}NHl9)%}B*aI%he14bkH~kk;q6`}R zKaXy0g{nXB9@qB070U6u37Lfg$QS65bgC;mTZxJ3u94aqZ~OZ^3&X;YCt#13B6FN& zh(6edf0^B{jh1Z4f;<{xVN$Z($qV5mI)Ov-!FuJbrtwPv4b?p{Ai{^&fNkbkll&A z-Mm6~hv9wvrsj%co10hHde9Ja3kxr=r-1kkvz>%z*HSgzQZr^|X6kJ9J7{e*)JlwV z^tkip_l`cjj%W3Vqk8uBryv5TNOZn` zuUfZtdH-+7E0a84ypmRoghml3?p^&46sL^#!y;8JzGpH^l#*?n;0zOGZ2}>yv{c^8 zB&D-?$+fPo&eR^ku4R=gH$;t~iO3`zYTr0?hsocR7GdNU6kxMm^orz(nGK+WHaR_Q z^jzbUx`2PWRi`wzk_H#d8#fIv_$?MT@iVpN@o)#*Z9i)|#Z0Mp&!VW0pLN@dx zYYUGfd~ctV*5d-HQO#6ho{A&zv;_GG&%3+6$Hu5r3tO?yMy0(YTd~yluz@Y@uFX)f z?XIq__I()-ju(4CJ=rP=)mf}w&$c#-(;kiX&JZ28*@n=4%jG*W5FTDZK$S%cCtFr% z&E$sP6_1FBsEl5kpPx4!4y4|aX{X2*&%0UQssIAs76P9S)`q}^It?0Rj3)DdNFt2{2oCrMOQP*Ga5Zrh literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/refresh_query.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/refresh_query.png new file mode 100644 index 0000000000000000000000000000000000000000..eeb4e751610b60922be8dde053997a2e17d2bb00 GIT binary patch literal 1873 zcmZ9Nc{J1w7sr3I7@BNZJ2DK7B@MmiwAj)xBQviId5n-DjD0LK));1xvejdKEH#$Y zgY0>-Bq3!CIwoQC7)x42q^PG5^G@eHr{{g&^Evn4bH3-Ed;hri+?(M@vXz0W!2tk} zArkOT;>iACQZTXaxAYzc08m;G4(CY3;gAuGaQ`5h9{}j*Cgz?b^kdbZc>QwQ$p9WB ze|FH3gHF$Ur%Ohsq>Z@*PV~JVldB}+@)j2KJ5H`8fK78hw`2av}&33lX^^ZL4Gp}qVt(EOLLKqoWTuPI+;0jJM zncZ3I=(R}JwJ@Do{kwXcDe%Ce$%&Sli|EisiMBMu&0k6cU)J>1aXeE?HEf# zW0FrlZR`0pw2Kb@R-Syg;Z4(c@{+??h@l|^`k4k%6&TvjLX2YByLuE1%69#^5?o?_ zC;QMhUW`$)Tou*<2L)g}p$QIXZ8jK7K-=)&&xwO(^h_D1< z@ny}+tjW)NNAu#+gX3!RBgclNTutsLu z?{+D8^qf1ZQADcN;gIs(6v61w)qmHzgu6H2cBlN-7E{QzCz0~pnk1%Pgb$9TQdZ^4 zw$>G2Z0#N%g?Pp{A2!c~AH`rEx%Y;E!i21w(H@vEUejEn)`{xI!D>ww6&1*F9pG|# zjpx8LfoEXhE>)P<)tZ`@d4Ax0U(9OSd*iCAD(blaS@{h7edke_FsY-O!<Mf3U(L&^%D<7i5|no^AIax`hSv)lL zVdf_6Mz#I!4D>5wk9|47a7!;at$f|jjXG6l+Us`9$krr_W6=A2vB?ByrGgE}J3(uf zsJVQS4>knkdxZw9wH)b^S=b#}!a&3C9wOC!hYq=8oqWGJ8x>6(XtjlI-%nVQO|xD& zzL!981SVS30-o-PI?cbc{7XSK6_=tyl;@0;#gZNAa_pF)7em25Z!ygp({u=YIqw+eN zu#0Q;m-}BDabl&u>-8-TK+qG*jC+n|8;iPYrqV0wNQI0jdN3FbC_p;NOzk%Nw^t!iQQ2#)$n?gnK{%Q+|2+CLg4__E**7#0jQA%i)lpr}FZk4I-odlB4= zRq>5EiSbv+?0jv$int*1Cs04xh`jvsRuj>w85w&7qrY@7exO8^?U;`)o&^CvVTWF@ zZEc<7$M2iCNO;oF7Jpfb4;FTa9&f}VXG##XI$J>ysQza<075!K<7MZ$Uk^C`mk5B^ zrfgPC87}bH_ayEP*6#{_&CK3qL^<>$c`u|#`#I6~xgZT3N1N-=+4M9)c>;Wm&)NRoJ^j4ks YD*u>}=2N5QCcd=*(T0R?w7!t?A4Z=v_5c6? literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_delete.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4d1b7b7020b26dca47b16d1e3b6fc6fcbae30f GIT binary patch literal 1405 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_index_seek.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_index_seek.png new file mode 100644 index 0000000000000000000000000000000000000000..94e66cb88ac9fdb27ba9c6639f1973985e37b916 GIT binary patch literal 2103 zcmY*ZX*3(!7CwnI(xB#{N=2%;W{N6BkQA+X>ZAiT6lr3J3UW#GxldJ0rG}b2L_LbD z8beWZh%u^2OAV#wtF+P5OL%eD`}5Xbd!N0&bM{`}I{SR*wu_Uk2vQyi01&aa!@BWT z>YgLu{Mc#X(*pn`G04Wo#oopS6&g+q2*UdVpq}x2hPhoQM&b1p_eX9T$eUuWESEy9 zq~rxvPpyQ+L9gq>?Oz5(OYLnkr>E5$WE8f~Rhl-KEH6!IAQF^N1cFntj@$HZru7{; z(bTPPUnge1Dx!vZ9E{A~0MEJGO)W%#9=zvvO~d}x7x&>ezP zO&qjj#?BG0c^P<2+fOHz1!w8{UGg#^hI#dPj=WHd_ffCbW;8lQh=pmPX)0J&xvzl# zxun603|};EOJ8)CI^&#qMwJ7XJ2B@^YJJ7+nwsG=ytNx`%gtshDjq@2I!de1*={@3nK+t`X* z+ax2dO?N$NdvmL}p0m5NE(G+%|7MP9J2Koy@y2S^^U+SxMelh$b4OLl)0wbKRNYYm z(@^1nW}oFyKwatQP`j}e8L&CH;mmN?NKR<(EmOa4S_lP7S^ft(h4C5^e&^x9TWR}t zE&`k!_;&pYCkg^!0L9k`s9U<(e5zFlkc?0j#00zGvxeHjK+A>C$j|vm#DtJ6U+Y?wof{5)2_kU#6)$Q2@!+qB{ z%SQCK*BJ3N!@-`hh4seiM@L4jzCcj_f7%Xnftj@UBc_9kcOC!qNxiDrC{4Cc5(UKo z00sZ_{W7A3LDm{+QvL9v#8_Su2+WtX=2>CEh=ktovV;RC4Z*(y1i+N0LcBRjZIO%f zO08zmE7kEkIM~`H&$+s%|7`CyOs@wEtb~sRK@qjQK`;0+~+uIS0tfqJl1qQ|pIc|cA{A0aAkuT{p> zX+8KwiSsgNGMV*%6bMkYx}cZ~vL)P4t({GH*6aIZjo<#$&pM^yKT>KcTYc=iVrSs& z%++kM4`jWEU22&Is3dQFBqO1MhH{H$p6>F%iT9pG&<0Opn#T#Zb7kL#ogsw=#p+BL z!Y)Wyg()z*lU!t_yO(F@qmN(@>P#R|6oP zV&xQ%i>V#a^l6^AJ2z0t(l9?vVN&6o92(L7*UZ09Wng5~4SF}^spAC3EROzIjFlJhPW150(_S1mHM zk9L}0ctN=r+Feh3aj`zqR556oi~TdEqEA#6T0Y8f_E#D3u{Z{;~XJJ zM|;Mg@|2?7VR=F~1q+1GG>8%lwk+{y! zF69%;%OOoKUPz5%r+@s&E-EVO--)Z{m??oPeg@L`<{INQyQYoBV^v<)tN+zC$`A#Z z1t@Cok76zAQ>#Vpnm>1~od{))wH*J*76gV_DfP6+B2WN-V1+p30k0PbY&34w(8y|x eEneNc_WQo{ynq3EK;;}?HozX|gnep#HQ~S4<+rZ@ literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_insert.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..9a22f89ce3fc50019cf3b01dc0f06d15a7b7343e GIT binary patch literal 1299 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j)7IW-BQ(*fq|Ld)5S5Q;?~={8?$Z)h%`J* ze&~2(!p5$4z9zoL8y9v)J1(C7=H&$T3D+KMT(ER?+yU=0eYvkpce%DHZaG>~d}Xbk zkd(}BXG06Mz9(9mFXsK1?+%`De)?){S3jx9X}K*|(msj-(~kp#0)qep2g8z;X&1SF z{k3}^)GOV8d<_E&0}}%yLYjqv;RCXABfQSU|dl1W9d8Qn!i8RePfUOmMEBeID8|MLCsMH ziG4{7Jn@DMZR;f%4u|tJJk(}8@FD(%ox{cV3s*mW&L*+1QQP6>@%<9}4puiPvGBwn z3_YL-q%PJr)B-8VhFBKy{CLAZTH%bP?jK%0;tjsGg9#M+NWppGu-1LfHNVPVcZebf z|F3-0O**$TtP+InpC90Y#Tr!KhTusmkABxZd|h*Yx{Bu&hJZqK15Y8&CWlK~?yT?6 z+3qGbb$w}U z_}LFv*D&lpTBuVfbGpQ;_QU(TdEqwah0lM!!7LEY2y*Sr{pV8UfOhI+gmp6hC^2mTzOwr%1{>0A~?}`byMo!yFxSn$nL){pQk!M(EQJt RbYN~_@O1TaS?83{1OQUJ7a;%u literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_query.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_query.png new file mode 100644 index 0000000000000000000000000000000000000000..073dcef4c7606096f58146fb4436ca6a7a8fb311 GIT binary patch literal 1122 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j)6_-v*5pf3=B+ho-U3d6}R5rHO#veAamfM zy#{j=b3~8M+y_i^C3kl1H4dFBF{4(@?O7bdGQKq@*bS1DWOrTgS~+>vsvGZrA3G74 z^yjhd=NxrGpz#h`Y_Y#v^{1a+efXP&vwkCk00WZ)0|x`+gh|u)y}gjNwJ7BMn=)%< zsHg%1O9M!WK*MyfDg}m1pC{eoGmn*jKWp1}dkID##u-diDR%R%SIKiO$UlE8cYCz^ zRS~cru!axEtQ;=0o&UBb_Hxv}<@)#ky*&T_-`CB842&?Nq2@yDd2n-Uoxu{IIa{x8 z-5;96V!#ShcEHME`rr4zzwO?pmxL;OYSy~v=C$YK`;RlDJKKT5X5zK$OuN46$ha{; zYykU2CFjES|FUE$Y~{?*7)lDMp=}bd*mUDLcsLn9VMi|I+~!Pu_e}f|0M?dCm1~ z;na51*xLm{FH{5=pyp{r8W5toZZv_2-{9(@v-AO!t1y z@Bzmvv4FO#pqL){6iD literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_scan.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_scan.png new file mode 100644 index 0000000000000000000000000000000000000000..24a43a95fede0489034e751468ec2f3ec7a5c888 GIT binary patch literal 1333 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~j)BAQrOu>v3=GVMo-U3d6}R5r-I#YPK&0Uz z^Q(pv7kH0^d52DKI&w`sq4UV0c}w{d%BC#r4qdrAUcvc$$;S%^i?4?;b@uihSu;_0 znnSym=voc4jlLf(|J%EA6(*gV-d*hMr0Y3p?Sz}J?yxc_FbFVkFt9K%F+{#{y~W#h zSn+#MD|b_aXaj=-T=LW&{snKJ-`kUUTRf5Vfg(cch+V_8do@4GKKz}3fB)3-^>Le+ zV8$^5RlQ+;v+~XT{qv)rm+h;ZKmP#N0cQq~INV?+WbX5Of9$6Htc|((m|5X@!MeP( zqEch+RF717c?MRV=ZSwc_+KAC)E@HfBV)jYf_Yj+5E=gEClsgF)-X&l`J>bZlAN&l z_U@|(A3l)`n)dL$-2ZQRtPR2CwJ%SsxPPkTcCx^k>7LIXc6apr(%reQM2maDrT_8| zF2C5?(NXhr->Dvjwf*t+DgXW~u6zCc`T?#F@`5s(g+!*dJzRa0-GYtra5%? z_jwwU1tO&OX);6#L`d(mWM~(NklE+S@LM24c3;QAdhz|;3HNU^7<3)T`jd(rhG=1> zb^32j!=Clg?rXr21`W*%Cs(O@ZrWOMDD$_Nqre7~NB|lTvQwk$Na@`xw|B174iuTm zn2@Ay(4{2Ve_ZJJ%{cQHj~+SI+@D^y`z+T2#q*zy_~Ttv`jS7|^ou4~%{`T3^ssT$ zp{0NGn!6qJm^k6KF0@7L)))_uuoKhnY)?jACjV!)GX_WSeFC%f;i<6&c#Ie$pD*Uensa|W277(8A5T-G@yGywn^H!%AE literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_update.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/remote_update.png new file mode 100644 index 0000000000000000000000000000000000000000..f027393cf47c614ee898515a026743ad0d2cc064 GIT binary patch literal 1755 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/row_count_spool.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/row_count_spool.png new file mode 100644 index 0000000000000000000000000000000000000000..40ee6c52b00a5442b02a023b5d633530ed711ee3 GIT binary patch literal 1663 zcmYk6e>@ZTAICqNjkV*u4apbBny!t8<0?WnZI0bE!;IutGEU{kEE2Iz$5$&t?m9x8 z{OGLo%^ga+5r_OZqUdNPiB4tR=BQ?KbANoleV&i^=ly=X9`DEd^LV^pkH_Z>li_WE zG(!Ra3}`;o0Bsg*1VUGPcY7Qf1OSp7PoXer6bd#uB`G%k7zY4CaaQqOpKh|nuaSXu z0k+6Aw0}Rdl9(@gxjl%OlRL)#`eE1H7^;RwDVd!mw3}G0g@|3-U0yBD*dlVQu!)Hb zk$u4Idda@Crl>;IpG!}kFMW!AFzCC>trrBfoMX9fkLB%%p4sfFzx7 z-TNl@o;oEtt02mG{KCY~lAJp6h9ge08~KxG8g|=NDm}R0f4eRBT}AqX>Q4+wDdB1F z3wZYr3FGn#e2)~m_!3Q~LlO_OomjK9+58`llsd$Ovt5$7?7^UkJ9z#fLbF}NEd~$G zCE|qJsQr!6I-HRFu^)@0ab7A%)VkogUkQEtq^{|nd4D1D-k+z}yX1+(cYE3|8H*s5 z4y|fOeOQ|C%i&h(`GgKG^xb9Qj%zQP9|-^O8#`)emjYWprn6dpjy&!L91*^_Bp@<;1i>bfPnG}Q?00XoVMRf?*-Blpa^$$#a97< zWzwjgtn{fj75_~d|H`yeI)kKh%~=E!zn~z|?VoVw;v2QL^sZ4Y>N=95% zrX=EGhQveh)XI5;4D%@~C@APp>*MyMhSv*z2)M?sV>fwa$MSea5Rq@~ee`szUTfQQ z0@p$hA`)>9+^R&P$;zt$vh(sk1$IRuXkQp=SI^V%1?&8{IPdb|`OcNPy3c-}n!-Up z-;4!;5a?T$0KhpJ8Ll^FN_QB+_WG;d-;~^O7}WQ3?lTFyiS~1-mjE~GQux#K8{wPQ z1bXd#rs7}#301VZiexP~mgHp*-YlK7$p__m*|1UfWot4cSWTmlpy&@6!RUGLO*Ra> zyx@vrE-Rs2YHl{BIJV{ACwB`F;A1Y7>W!-1$xoD6DyRqK|A9qSkMoizEck1|3=hk* z{FnFqQNZ zCpXHgHYpCTcl2M+_un0}(q(r`Ift@w*zU$Q$*Z}I01JAWw;Z<>d#k)rRNeHVPus)d zvTsF1&8sjD#C5HG$kEmoB(I`P zEc3!Rt0#99tYlL6l^la^rqUQl2@at*6|8keuU*wxAc`~ z!!^36X)PR;2a2XL814zJ;cNpXw+PI6f(-- zBZEV`P68aj{(~|4>1rlI0F!7}i>P)yWIDhx#0usO&sFO6tFlR9_K+l9&K~@##B8^{ zT$4es?4+5cFT#!>Q=z-^T!m(oO7cGbb=8-G(z181!q*F1%yHxaCZ5S_G-}*)ve_s^ zH0_Yrbg;N-0KSa|J5w?7FEYrzQjA=Rd*mvtkH?YOxR`MKTX6~k8sp1Og^skIrt5b- z#K1h8`Axgdhlx${fEg|Mz*QI6C^g436^g+Q{~E!V2==d=MOSy;j~Wd>58zw2-s`j` ucg2{-j$*L?*_U5Ix@PYD26N;B`pmbKLgE+LA|~&D(7#De9!*? literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/segment.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/segment.png new file mode 100644 index 0000000000000000000000000000000000000000..64e1218f63000fb15d8571ce35fe574eae3449a0 GIT binary patch literal 897 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~jzPdc#=t5O7?ri2E{-7;x8B~~*n7x9z~LgR z<#JXfp)H0&ra8h>9&!lo6o@L|HF?nEWY#)`q4U6vsOtOP?@K1FU2kb#ALT&xVu(c-d|8|Mw!tYFK3?Ku+QU~T#Gkj-wyn`Jk(7+IJN$!Ac z11HF-5M=@9fdU6C-XS?`+7|W#{sbnd*+6AiHUk9=`l=aNVEP(V-!k4|o`K}R*EgB} x{C@v;sW*zVy|c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~jzLK55BFU;U{v1sba4!+xb^m~t>0k-iH3(P zhNlwd)fo%%#i2p6@ zQ_Jr0_U-ggTe~DWM4fQ~`$U literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/sequence_project.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/sequence_project.png new file mode 100644 index 0000000000000000000000000000000000000000..29dc7b897807e3618e5f792c156437a018b33575 GIT binary patch literal 1328 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~jzL&`%egnecw^S_ba4!+xb=4K`h2NGiR1Il zRFoYjn#@RyaERM9tFv>~=8koFN%aR*-c1N@clPr;S1KHF=E$V8C7d%Q&(3g|sG9Of zZ-?JT6W{QP_u+B#o_`KB$yIz`YyaKu{qK9#?HoW$K_KFxhVNx*zUJ6IOBN0W1e~_w z?XTv#{p(j9ER^vUVEO(p&usR|0t=JNaa9Zs3@kX|)+?X(9ZWI$xXO|LZG47_)TP&7 z&up14_rUMR;)@=yzFIBcYs$FoVY!v8&~`P3htgsPO#hVa?q!&E{!iLw&E|s)j5_7N z6D4L%dNAWdu6Ka;Z|1Ij>l3cq>{-DWFVUu?WF*%=_uu>1r_Z-;`+oEH^Dhi~B9^zd zUl5)V!?kZu)XAq;xj0v8Fxs`r*Y5fE{qxbx)mw@h80NL_uYIe;sOsSPW4mgBCOgLh zjXyd<0ZcNLFRrD?A37hzCvc$AqL2Ssf{3Ey&Cg|C4a(xnbtUJP&sEtF!spY&IH4hu zK`26;fl~mCwC1zb{rr0Tbenyi-6V1U=uZ!CXXSI6tP`H1cVKn-{i`xM;hc5#Q76xD zzrNFM@?QoyuMPQ@7M9s3Ctr_Uf4iCCn5qNAV$*HaoH?)UYW0VUA({ z@$uOG*N=baiJcVsSN5U2=-Kx}6K~2bc=JJ$MaYgx02%GOSlX~^KL3RFJrAdU+}oUL zKYhY)rk;5}mmOo+t+GLC-^$1X|5XY&>#gQ0HK=jM9DdFy=%upb{nn!&e7PP7?fLd0 zbXvpFq`({1nf&`F$t`&G{Iz>v$cfENn_J{r8q4piC#+-lnB=lZ|v|-Wu@4x%DeY?aQz{J1^ sg9k+1GiTi^kaz(X0n0#AFoT0=J)^gCH=}t)XC6q%)78&qol`;+093Ff^#A|> literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/set_function.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/set_function.png new file mode 100644 index 0000000000000000000000000000000000000000..7272565f68b153cc59d870219004bbfbd84227c1 GIT binary patch literal 3064 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/shuffle.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/shuffle.png new file mode 100644 index 0000000000000000000000000000000000000000..dafa538313c58e8a17a9ff712ce2991daf512d99 GIT binary patch literal 2415 zcmZWq2UL^E7XA}jz$mOVQIKAw1wo1~y_pCG1VUAWAVo?-6Oa-@0)iM|L8?nfB!Cj$ z(v=tj3asLS6e+F{fha6hkQyNyJ$v@N^WK@cGjqQ=^UXKs-kG^;kGyzP;G_Tm07nsU zO9xJm|85XoPTOPb{Tcv3DK{-F>=70gGNIvEznj6n0HBhckZlC-F_nCI-Lcw1RUk^} zO22)HdRqE|5=xzrGVB~MMxP%RtUy@g%+9K`i%EWSeSD$aVCgT0Duf^{gTWxvH63Qz zIp+6H2xhXrtWM9ZO394Aw$=T)7eFy^M&r-bwy< zGHe4g4Q$oL-n(LaoVA^15wmHPfw{07*PIQoVa~5n?>dzey;Ue0H66$Zp)hs1Bn8WU zGMdZRHEp;q8!czWIxEP=&)MbJD2?-;IREKNlECj@h-~^A=1upD_FqNPK_#%(gR@ZX zs3hw*t+cF=XJO#ovLv-9Ov-4|qTO(ihDJE|*I+L3agEE8E?e<21x|zc^phRg7dS`|!qUts zW@@Fx4t~l_vX8b1$>y$F`c1YW2+^g%?_uwzHF2MiB9Ic&DSFj8OS8RE*~TdMwE9-F zeMOv;*}|J(8#;ktG-lFR$m47N6I9L3;+U+poP<_;s-Bgl4y;H*M`sTwQ`3p`+hBFh zu&CEhk0o6&y^^Z~sEFM&pHoDD0fQ1`>Id4X)N5RtCxfpjAbzVBI>t+V?i;GLzNJAR zCh6;I7Q7xhq3f!6PUR;^n8M{&UGf0&m*ASXM*}|nBEa}Ng(9^wCxInx6_Ic}Xa~PvN`|X1)yR}g# zU}ObsNrcsGoG5z#1hEccwA;UEie_;IbK*PDD!j`7E<$NfkLetUv8vH$d;X=f(DsQ zw@vuY=k@u`lF{@_$JH}GSoeQ^1jJHU^71I{WL=(o5o#U1QZDz?lt*!l(KL^p4_7qE-9M3Y(BBtIL)VGM`kq|4Q6AtI%Kx2+n~^4GmL;%Z zI{5ra6KW^+0i(&|#wukd$8z}BT6o!=+?B6EJY>S8?v}`@uN`NF z7auP?%~7B;!_QxWY3vy2&Wme8&zSNoniQdu{Sp=FFdolA$Ij{pc<@5W;Z9bv11+G1 z63u|E9(&v=Qn&%12+b0&(9_Rv9dRlBYcHhS!eG~Z)oNuY9)PfnM0L{#l6%s6@?+&| zHe9EWK49#^C`gAJ^4}opIkkY{9Vu2M3{DigH^?QV3HnFZkC|=IUwox}KP3FC1zlr|pJYoLRsCmw#?kA4Xlm7* z*qHLSf5vXmhn5oKV^gpA@&4EHE@0m2bp00+bM@E0?ptWwfzVsmlb17&^AfN7G*gbs zmc9Q5ZojITnl0_+RQ7R?h-^+|j>b#1d=~Fu-*7fNm(L4Gil?Xb4s&V%HVmybk^b>C z34<5iy|Sey3ok;m3Uu+FoKz21%7k{bR;u_{ z(hD5-U`;g1kERimJBo-(AWxfGY}yc77st5wvT~hPL|U!Qlz_HYQmem(Gb1lZiIkhq z)*3!45PmQczlcIGZ0K1v8+CKI#h^L8q5f*G*xNKe6zwDxC)kaPc$8=Z85$)YGQYnH z_1v3FsWIEgp=E+@I`-qYOw zz}Y~wrpE8kz3SJ)wY1xU`d3Yn%(L2UYPs7WnS}@+ba~Hc(~P!m*CxCsP&DDW*01_`IMgDg<_D@ut-J3PVT{rmKlRdWdw#PtqcWBtM-szbmqw1$@ zzeY3O#1yQr9r}^?FS~G&S0=}%$kk7#I03Fx-40yXiqp~+Aun{Lx}_VB@Rvt7SvOz2 z9>P%Oy^#E{*?c`jxoeNqDCgfOVsk_v+fW%<=ij{M@zF0AMZkK1G+#A#Byyk6V{fRo zr7Um74NVWHHO>%2%RB1IJrs9u$(laV@@T<6y9N*`f`(!Z^3L!*5quJD`eavth*j;b zx-=J79uz1`kOE_W29fgVNV7I7P{0oYDjjlTx1*rDR)>65Vm2-OF}=o|pBO+`AuSus Hy$F8;yx?f^ literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/single_source_round_robin.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/single_source_round_robin.png new file mode 100644 index 0000000000000000000000000000000000000000..e77bd9fa30ae3d12affb3b692e7a909df95de453 GIT binary patch literal 1820 zcmZ8i3sll+7XJ&3Z_U?;ZEh-)W)6ZmYG&pmWR*lrN3AXJm1e1dsAZ*z*jS9OO>1=0 zjI7D$Dy~jRKC#ApkYT>?kwTcLnUbR617z_ud-m+!@7(V@=XdV?-QPLi`JMao37n^v z`d`!m0MNpCdH5^dw4GE{R@^UL!q@4@&$FKWD37nQWXAuZb&lm_gKiu(QU{@&yl`jxjG7XKTr~c{0bX@qzw^B_v zF(ndlnFxP@JpWjh(XQOB<)x|VrN5dEv9b0?UIBp(*#XWL=MugT=YQ+2X_g)Q+Uxa@ z{(Od}a~Jn$N=j?i3S5*x$t9YTY+3vDIJT2@H15yk4%Q`N7xJ&a?8{ice`V;QhMsFY z;qpdK!rL%v)Xf}hbgm;7Za8s@cs9s3K!6d@9!1|pMi7D=N#r1Q;7H4UN|+_Xy8JmV zL5B>7QTKUtSA>HjPtgXd^1@;0t%JMdY16*>-WFVCqr*Z!s(R1z4S9!%*!SWOX0bu0 zQVH^z?4Ty(GWBnL&)WZSv6&27r&GVLnPCi3=Y0oatgYiAtFd4x*V<Bg=AN~|KX$rphj|~99yUqzH#aTqEr!uze@e0+-<@+#cs-RMkV%qxo{wFRJl3M= z1_sv9Xhaf8ByHA7r_o+blUYwJ;2!LH{NhTBjV2hvTDDFd96@C1yjajRV+C=N?Nnot z&U1%oAoCe5P#OTd$!4m}Ud3H~FgQFs>??OI!5zTp9nb$M@aU*91X1YSTc2&1)j87D zNyc6%8i=qBBkOd-0QO9NZfBwQG2uf~sGOeRhwPdmAR z?}^V$&URq(`#U?)voT6!<3?rv^3>7Ibq=W{Skl2G*?@kv@cA+Gk=N$3pMhUdnWOUO zjGl;N;*I+P$Aa;di?Y3}4Fap*%<;&Pm)s6KxGojTs_9{BD`xkjfZlriFuNx0YE{+g zN*rr1;0@kc_Kw9Jk zvADy-uMA7EVMfYp;l5AI{AnX`V{^PSfJ19uCG2kGb8>5lxFM%&+AUI>V06R>fQVVH=r+6&GCg(K37dW;b)m zfZ8DUx+T4)yJ@U_sD}Y9U5FcOsRLzZ8GNpzrBQ~1%ko6#SPLTn;L_*8BRfL;}-RO4$*H=_{Vi`Mz@K!-9rZHiH48vuX+=G!fia@BSak;@Z4)tZnU1cgHXbkEm1 zruIX9E@%3>q)Ro8@U`cwxd6UX8qUT95Gw(fmHtbp1F&YD03kTk<$sDz0Tz7$K=H~+ t=M^&kpQ;XK$&Syk4Tbzi)}JHl_k4w?$x(nJFld}d?Xl4Ge*>V?US$9P literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/single_source_shuffle.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/single_source_shuffle.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b27a7020fe56cda59344a811ee3b49725d5d77 GIT binary patch literal 1822 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/sort.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/sort.png new file mode 100644 index 0000000000000000000000000000000000000000..5d36843de4fb5c6e0c25fb26e067becb55e617dc GIT binary patch literal 1835 zcmZXUdpy(oAIHC&T*liB8y%w}_ER7T1rx4BK67((R0F)YNY3Yc!w1kI8hWQ7E_yGVikCtbQ>o!w<;q6lEtR;R) z+NsyETqiwqUc*f%IdzzHakT66u+&YwW&ZRuvQ1uj$K#$+o8gzmDJ`+&V{i(^J`?3U z&Cj>UQk2T!t*%UdS~&tA=_j5z^*i9!eAN}B;UA@ae(I1pROPDI0B&GJZXp$lc{yer zAO9?CO@|Yem_tzyLo+pH2hr@N^s$UPCw0rYCK1;Q5vf~cu_ILyvZj&bOWWB|uYHmN ze#s^VQPL4Qs!0f| z-n-|8{5;Z!>+{a5TJ!X!`1DT>`2>wI5yk(`Iwgtst)}q1I26|Np0-k0CaC;)>#jcZ zz@;QCtF`l5XnO>Bt1?Nuapu8D(t^Wqu&!?8f%Om}g)v>bNg-4WeNU5&M%b*qfr$%G z?OyHpL3EuB?s8)=W=-sm(V@{TR3T+$u$uKNFK%p%dt4a5BJkU$(A$#8K>$8=SMV+( z=Lt4e0DqsVXLo)TbRgll(@_8*A-7*3;6|CEpeahl+gXdwh#v(GK};;LIshQ7iMKL$ zjeWOVt{c_vR%{p^uPu1r3oF@&nMO=2PuFTA?~AtA)?tP7WOW>T6QThaq)3BOubi z|H$ldVS}=^&q%5HXcttV&9GqFms-kg|-~Si!>44T_eeA5#WIwOqZ;x{+asfk&DFH_xG#jw}W#juWOKob(K>A-6p(Qs;Q|-`fzJB2;VTOdfFC% z3xE;newEr+lEs=BjF(H zi-)v5PqCpd8wJNSHZTtFmRnoGJ7|2B4;}n;W5mSVU@D*y-T7vr$7@red)vB9W!xkY zbwIC<*GLL(kgUD^vFC99GItIOkl9kn@Nc3f_2JWEec!gD)aZCNhidd&CnwF}Cb}%t z0u4!A-8p8G`T};&K>F#;_DrRo4dRhCIMW5@`l}+p^glKA-Q{CNs6PL_EDo`{3YPw@K!{IHP9n zStHZ&BUtd2mKiDI*VkUCm=|@&SkPZztl53+ahC85h0FEds*^b9ys2H7Sy=0(fWV#F z84(^Dr44dFudf@7O864M3eO$ffU(7deAzbHgdp(skzK+1v-mPOms$JOMTS|k(*C49 z;4H*b!t@Y`xY&_hJNZaGTt7bViaXeDF#%>B85`TS8i!cztBNK;$p=ke@6QB4-sCZ7 zzRD@U!{!m;#ycZppfw$H`R6tOLDpA&r>B(pl+d&kb^zCODh8i?&kTYz6#FML1bJf6 z>Lq&7K*`e@3z+?jUJ-{`?zRI;NbPTN_T~9opkzLfaiKXSWS}KakfH$I+TQBE#ku6a E09L#?vH$=8 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/split.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/split.png new file mode 100644 index 0000000000000000000000000000000000000000..37c6369d8f89759d9ffec99b8a03353005ee25fe GIT binary patch literal 1568 zcmbW1c`(}v6vux#L|iLwRVCuAif#>A>Lx+lRl!bCw+$*Ju4<5EN7ogEcH2^`?QREk zRI7@rvsKz4b+kI$(hNeCN`)dsv+T~!>_0m@v-6qnd*6BU=KIf^dHKHHu5!{E(f|O+ z;oY!)`<-?mIBdT@u?uGd04SH}?Cgtoc19+VNioEPXaF!`WwC7Co;YX@oIQQp&saJQ zacao7$|SGgg8{*Wkvksn!>hjearv8g=d#&ZqjptIQBcFlcFX0DTw^#x8=08sU0~`r zD=u>?RF^N_U0a=*TRnoDWP4gzKLZFYMgBGhF_dEwTop%IoubfTx8X^prCeE?!6{oR zwX0BI!l&dEC+d^TdJPphX4B1iQ~5O*bk(|D^3}_Fx!cz>CU3|n+LJ@lgiOj@yOZ=KpYeD!nhf1YfT&HOy=EY$>9ntgA!d56f(d153GQA| z_fg4>X>cE*t!=^1Tbm}E+L{8<)CB9|UWBe^qz7IgiGLw(Zb4pOBXa;Gw|4(7um}%V zEFeDMMpsSw{zNLt?RyFU$S55M1XNsC-yce*;Jt8?JZUXJRc1Fl|9I46QFd5+Fn`rZo3lqqb%z(JLhQ*k=* zK^EF);sxyRn(+XH*&?1D7R}V74#BFn%qowdq_Bs69s3aeZkK7cJ0uV-Xmv%P_Cs_I(*8D| z7tV2ab{<*uBs2z;r*)z)yWjQ|a&+Cuh3Yt#d8JqW+?xuESM(T5b!7<+!y25d z%uILS?ihdT_QcY>!BM6Nwa8C7InLjb3R6^wVx4^|!n|nP#C#hMJwL>uWS`-k$wFMh zFl=~>CwfK%I1{n|=ed3h4Y^2sNy)mwi0C1^&5mZSpo}jQhLn=N=p#SzdSSsVz9(Rc zLQyY4I0_3p4K-z_p9Bu0l0vdg7Xeb%>bqDC=EX4~ zmKC+v!}N8qfI0yG1y|`#w^>YTwoA5nn~|CZApZm$CItuJfTg5we+|FqnVp!j+|n@0 zX@&rx|AQy3emSVADKd7^kXA&-l$b`Zf4Gmp<2XKm)lf%Q=asjeyYKW>Z0$kwdW$TZ zznqDo&z~C-&pFP1W9v!|F5aU*Me?FpQ7ExcWVq-IzG`kAPpCW2(O`Nh_Pu(~x<^%D z?FbrH8VFT#NOh)*{2VN5FMH>=$v6vQ+gran|DtE4bg|o3|B8yGEx}AR-dKF2JIowY zfFfcl6$i_^f;Td4+tO%#VaUb+cE-(bKFZ{$F}6yz2k)({u6hS|w_Ks2bTj0IjR78s ziHRBVTxTe8ULFRSf$kvaBtccXOtU^%n`ccqygj3^ZT!BDLfb0njTO2q0!`)f*O7(P zz_qVRj>L4ZoPYo=H2|Xpub`!RU@rkdB21Bv5q<=#tI=JA#*mDo;6?#XIXilI9Uhw5 z!0a8gzf;@7BzI^cXyb6|C4MS!-i2FF7KN_|v<1?|5M0FU#=HaUec{s7lPp>Y5J literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/spool.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/spool.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2a20d01bdd3f50e6d2458462a6cfb9611162c7 GIT binary patch literal 1684 zcmZvcc~Fyw7RA3TKnP)#y`T{S1Wgcei?T%s5*8z}3V{+9ErdNRrWHtnWs_Bl6oim~ z3NCZU_ee zK-G;%@ZNRiC&3hVYo9~d5CDL(qn(|-+?<_}iL``E(Xkf+0DV2cu;MuFWm286zi$JdfG_4EX(6=xb+wDfwWyQ0Fvaf8pmZi7zMjtYjnX zewnsUPk&ypfmu&x6vvw-*mPTHjo1jj%bU(`IF4m+IwV!xL}g2=>62U)Ek{~N+ICU$ zSQzVzoFY$ZG0qdC%fApG;cw%+=(dxtdWE< zVW9~9_rf6;FXW9sxE^levU6Bn&RjZo!^3=9QUB!Y^DOwlpI7BQ>+!?AKebnBUjwlZ zwMq{oplPf#!>wHHg+ZpA|Mrm<(|AXb-|GK&x!l8R}$nk(eFP%eygO707&7z z-Mc7;d$j#yUhv*2K`5R^ddScI;Q=A5(}yk98u{-==t+aL!R{OQo)e z1Rk%~#EBG}F9%dxaxpK=SX$%ydxFYhoa0E`@CCJn!ldLe>GyZejc+z~E={atY-KXU zPwT2Rp*@wtL3%Ekxf`j!@iKqlvUB?3!-oVh*w)rI62Si-P@ygo_%~%G)K{5_voiWz zh4>@HfN2G2{11cph4L(NlkRyofmt^-`)YO;^&kcG_q0!L9d3+VgVayW=G#tu82jL8 z!ILF8rn@Tw(0_tC8FjqsNJiHn_T>pOnY@t^s-&dEa)Y)}+r* zudOvd6*Mbe1%b=X=cIKsiN&d@9RiU8I%t?3Xi&q6Y6)6RIYm8cSQ(uA<|(y}AIZeb z%*>4PctKXpI-uqXQiJKpW`$z;O*;h+f&%PZ8zM;)heK|@zv{n? zd3uX{|9&e?6|`|C5jVC-_J^eWEJ} z-2lv|w^C-0*>}i&r8S(ISiUPfG>1AzK2QsAs?6~6S`PKy2>9(W{KKocRG` zgXiH2n#;R(==H-~x%$xtKH`VCjx507+PkkR)1vF&3b*;w4Lp#MgA_&qT5iT1SzkG4 z_;F!k1cR*oEOw(M1mOTiG2{3;d(7xQ?^eKCW%wJOmM_+Eq>GdD{eXdh?$ZncxvPQ8 zjD7|THvf?MoNNnz(iZ&uN?);{M`fp0mSI4Bm(CS#QyL>eVH9g=%^`8UT-FF4Rj~fA zKry`!Z=PaC%Y9(|{|SCzL@%qfJ%(}w4eGVFE2!&7Yq}aMn?khhB+hkcZ~dGvV5Pl9 z$G3S_9vXZFFO_zBR!$iG_#bKq>Z^mXQ^HYZKwnO-izafpyK0MeZ+8VKG5_c)RIO4Z zPJ|L!kKaJuAE^+2V(UG|6a?bOBLgkIlaH1dYnb5S_vb~en#cjm0JT-9|5-W%J8imC zT~gZ*C_Az7ToPr0vr!SQVLq+=7~`=ew=9AbhQLhH1FU&_lT~K=?^1fdmBn`78%8>P z8?W2$>7NQ7X}hW%@?PtXebjUMQ3S{x)l>DWf(hOYrJst{1|bae%?J49JDS|?SCmPg z5+aP^EsdA+;gM#bv0D?Ol<#5-#uuO-riafqzL7NVKBNeqK{Uul9gkbX%o)(cb3+6*kKa` z+LAIofKhFnp)9YXmyq2GqY?xjXElf%oM6}thsgF$%LN6s#vTaodW9rlc-$r0`JlrR zi|?bRqf4bk@($%aGt&^^C%JwTh15`mXO=#v@m{00IH!nsZI=XTZDFQ)Q;fZ_gyE{@ zYSb&2RI#U)#?tPd#sfxEEqo!i{M90*&AMK6p2A!>glb=z-8Bc(sIhXq9hchqZQ3jB znqION?=%_n{T~K6s{Z}3tBzgFQ0M2SoEtHqJh6t0+Yk~Tocd5hTO#_CC-|fQCsg^p zdIGnpH|8oL@{Ht<+qIk1B05XgM18TBe3lXjjf3$URHQ2xaRdSKKa1cFqsGP`^17T@ zh1Dv@}$KtN%)2YiSB`hSCFR z<^=%M4F5F{ke$m+oFsp)siQ{zor(j*2Q^Lm5CH&?P)$`OL%+G-me$&jwKy)#wcVs2 zL2}SaJSbMom?LQVCja@%B3@TJ{u7^lOiQ-ns!Fu18JE0UsMd>4@nCab&Z4NsgBPA{^umf5bw zKv-E>+lmQS|4wU5&Tqx{SnlfZrW9qK4e0kFTzN8X-oW2@B@GEz_9G+>am6Upy;P#J znhO=D7}K(VkSPVAVmn|_Vrclr+)8gEX9$B~ih-3ChF=i0q4aNJK@eCmvO`Y?0)CQ> zC0qGAQiorcbI@t?SC02~1FScc`&_QgiXXYMS`gPGWMm)hQ+|K*l zH{h!#GiUZLw7Q)Amf{vL1@^n*bQk_8evi`4zD#ak{6CboiIi96hTdGADK7ea_aYbn%CH~ohv+>ga3 z7#6urKqDuYe`ORNYn&5lfq5R>i!OdQa=Wc2S|~BND4*NYSj#V9Q#!-69XSq*{ujN8 zkUS+!nJ={Ii}mSwg%J-SA{McAHmi1vVO&!u_ckT=B|c-f?7~DKCkR@V-@rX$&|5z& zNeyeAaH$R|;7ux`v3kf(^lzD}cw3ET9T>4wMxrReBWAbmu<$7EpgsoM!>&zlN5*om zaF(>?;cQT|dp6%7LC{w*CI$JTS_`5maYZmzBADm;a*j?MeECEt*i0XpGcA3 zJvbf2f4Qm;2dI=i^@DC3j~qSNs?tQwYg3sQEo{q&xzf!{S4W0NujF{vl1-E6;y7U*Vc z4t^H|$DJsG#!{50q#7~@n$4*BWUib$1WXtYy?oM2lk{42cj^w0sY4WNDT?n^et zv@KkeR*_t8SBHE#xxd*D&lbUEn_oKq7lG260_GA%eo5@;5SGU!PRw0B3B~G1{-7$c z^nTwOpP!0kIN>HhWKX(L!^h2_r?o#kuV!z4S*DpOFkj9V*K1_-UM*Km2s<$v@VfST zE1#=@t>C~H0l4Eh$kWG@K&6QDOV{Tp#?>W8Gx95gMr7U93!^N7fwgbkcnV%Vz7KVE zFSD|;EDJP~Nj@!JkL<$r^r+vxdsi`eg4`F6BynGAQIh4*;KE~tL*%T7F^yd=^_{QE_u<_)y2%l_LP?sSZeWCc~L1muy=mZVg!QqNF#*yx)aFhrAN z1Rfn9+oMpL;`y2Y;;@Zqp^bRi0Bzvj3h3s+V>NMESz+d31dx2{1Yfo@2s!b(%hEkw zs`qxj2<__VNQOtMzSm75+aYBcUtU^D@cQ}ncTCIcQGOy?^w%SOi_ux?3Y3^e*2Tre z_vV!{Qz$>bOlC1zzdZocXdyn#axLk=o~LztbMut5DUs+Lo)$Nf5PzH8-@Nzs}A++7xtyO)HJ<5-O864o}N| z&^#*Ye)j7)@W`ziVTVmfxL&@U%GlJ=p|sV6eVSaaEfNb$N&yxy_tF@VLyduff&1(I z3_}X3jX(@YR%%4T2{c`0X+LMnJs{E3)AQUqTBxDYBCsf0C7huaKxlT3jL;nhfAWwP zPPf0mmMY}+Hh0u{T@2vq{^-5U^vmZHoznFog}27Zsk3jHuuunbFsQDv@lLE_q7F}Y z{?BuB*CSf+@iTHcIXPw)7P}g<4x1$ZsU+`10fC|M8cDfn4`Z#*rIq8EAwys!O_RF1 zdS*jF?T(OP?YT6A>7ogtu+uPtHP8F=w)3Dud$ZL0iVA8X11>HuKGQQ(h5JxO_)g@< zP7>@RbtXzq6@+qR5<46^CKcwJjdi@lu6s+f5wBHtcNgpXX07CkLcuS|vT5?(xKi2vA)>SYXUx;(z)VM>7FgYv7PV?Yq9agMTGlHD z5BoK}D6(EM$E!!Da}{iZv)vqJo1f=C$TaM8lDsIl1B!dT?jAcKGD{!>b{~G-iW+s> zU}I-DS`_`=^Qe`WTPcw|*z&kimV2CC8Xh!xyM1sFa&~@h`@wYODBzoiG?C~&KJy9j z@$`$`!HzR)`*dxb*CXi@dp&m+?i1sX&5IZ8qt2=2mXaMP!GFODFV;CIMv4nD^r z^bRD+as5xB_V)JWgdEfjA8&8^-5exBTw1!1Ez^Y&oBrtNkLGJ)w9KMyTh|OW9#>4J z{dyzHzjf)I_T-o$%_iz#GTEA#cdjS}>yp4Up&vheik_x{Ksx!}sAc=lO; zONc!_KHfu`ZQ%k#47v#D?5UT+%x@nOFfMfAq=2|QmIpIN5(-SrP3TaCRwzrj zoAOXYB2kk$Qc{k*!V+}FecD1cug>fQIcp|sci60a|Q%zU3O4%m#e+vA}q5uE@ literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/stream_aggregate.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/stream_aggregate.png new file mode 100644 index 0000000000000000000000000000000000000000..04285c1a3edbc568fef45bec42069c11169c9088 GIT binary patch literal 2110 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/switch.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/switch.png new file mode 100644 index 0000000000000000000000000000000000000000..20d342a800eed45c4869f50ddd1b4c030385f1af GIT binary patch literal 1687 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 L^>bP0l+XkKwUYF> literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/table_insert.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/table_insert.png new file mode 100644 index 0000000000000000000000000000000000000000..3b515fdae438012f92f61a86bee383c0e98db6e7 GIT binary patch literal 1121 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU~J8Fb`J1#c2+1T%1_J8No8Qr zm{>c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~jzLxTF8dTd1_q{BPZ!6Kid%2*8hSB1N;F*T z^%N9ZH1~+#LA4An?ez&0-SQ^{b9@uBY5$hV6nB`JEN#y@0QGb{@L+tya2>!5tyLVfEd0@!hw-u3lMsLt)v&_3`)i z@2}rsXSz40tYQA)`2Blsa~3gvDE=Xk!t!AIL+1&M4Xc2pLBp=Y?FxT`=d10{WiS_S-`e)Y z_Rq^5-){K|__Y0f^z6}vC);@!oSX2^=uhrieuo5>SRVB+zZh7YE<7!8TF>uroWltu zp!qf5pS7O%cnzG z7usjO9hQvgQ_22!?KzDxJVZ;6Fb8Fo_#YzUn+wy!}ryn!# zU)IOKxZqD;gGATgd=BddgdKO-1O6t}zh5AGKoA~N@0d+Azo)-)TO4?v4=%`{F{vsw kvTg^@JLVGzrIBAa*RFlAdlBQ0;|xIH>FVdQ&MBb@0D`N%%K!iX literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/table_merge.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/table_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..f390461bb546976c67bf26c49f65286bd03760ea GIT binary patch literal 1772 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9WW3U&}t$WWauh>GYYRV;#q(pG5I!Q|2pp-DrM z;^HW{799LotU9+0Yt2!bCVZf;JBE>hzEl0u6Z503ls?%w0>9U#=pOf@^k09CV$ zR6HhTb1P!t6+sLkj9$!0%+wRUyKw^epMfi_<*(F%=}*#Y zEiG~c^lSqc*DX!n11@)f{wG~BBuDbo6bc34{fxdT2lU+n!Bw}n<~~jzfDCoDbORh5 z0wYDrUh{Z&S9@>&o@w^?1J;>x&j29cr~m)}24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jvPL04y8Bf4bfP00ihsL_t(o!|j({XjXL`$3M^8 zp1nP8xaOMg84V2+30x0DhF*lGU3C!+R4NBDV?>OQh!~PxD1}6j1=fX%L`D!ntgB2d zh8JF#iFy$_$@!Gi?Rhyb|CjUc;ymX(&)Kuh?Iv&h!GZICIsf1H_x-*74?LDfEHQwA z)3=Ne4ggZe$(LLJrt(%~v(yFv-gt+o(3RyW+;{f z(4Jw%%4ZPLS0FuuEj^Y4O8J{D%f=Xg-E{?8Yg{)_s8L#@l=9!JzDZ|1ABd|+R~a+* z!w>**0Il2_Y8q1U87b4+KRl6008qw6D(2Me4fX_5pH8BbipLc|?RiKqRt`i+C7|S%1F{N(B@OWycm^y{S+Hdk zs0ZvHsR977qGcwZ&rEm0H8q)0l0NuiS+P?_CN&6UP{yD042UXEC4FC24m|wJRQP^i zYs;MD`N)>18~OcKh4S^C^-)*)wCjkHYME_(-}1t_RF$7^PwLQRf%V-h8$#=AVx>B@ z=EK0ABX@Xr_Y(m8bj@bR+6Dmj4UcmC!ybOTT8b#>S=GSBu?hog+S0WE=3{Xn>((vh z=;<6^4|TA5aSDKKgXd{%Y~;yIoE>W$BGxMd-76cgq(NwEGAHg=G8JJUcmVzw7vTe7 z+inJ&pn}Rbo6pMlcNj7ilVBhdLh6j83w*Z!9apl~5rmej5=~>#_>&Rxa?A_VJz~K=b+h!`C zC!fy)&{`ko7Mk^)^Gz+Vgm>vyK(p zPf;qCxcKe+T)uIZ4P9HV8o9 zg1`%{H#ObRn^!N`{d|U#mkJB&hN~8*8PAKkW5Cn3-LT-AkO8R;PT5O+8=L3s`N72` zuwENK^*q3l21h=m7X->P=~(2#0ide-sV=i7%h&_u0jQwqh$?^Ar(!h>&3N_Aq+^j= z4?y*GQ+w5SfvA$|o*!Tjc2BoH5(7)N?)_i?h?-Y##J+jy@vq^dm;V6m(;6DSP7A*P O0000c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~jzL{0GW_;N1_ma5PZ!6Kid%2*ZuE*ylsNwI z`lEZg#jTf?dT)zso}jwhd;Q^s(Fa!-yvUo*v$ttonSha1*rqOa@r#~?6Q0bO_ug9d z{db$m2|uQM{$JRVFo^?b$pTUK*z2~tc-~e$7vf-GRA69fU=U!?wY>AS;b_uBt+yMm zWaGpj+-oXMY8TUhR2Wfb)GGiyM?oZG+KckHd# zumf{5=A^5-ud3b0z||jIwB*)v?gf{AsJej!+;;7_lOvmc#-sLFeeJ)aPu&=Tt!?eP zp4MD@z0p}I;{V&KetE%-bIw2d@*^Xk`Nr$->=w~=JslnM>&^Bm-+20a{p)-7^_KJZ z{^5Ja@ZYdWvAikBsAvAO$_7P23HwBbV7CdGe?l021Rb}1yv!P4+|=`UInM$&mdNA& z(hes%jQZzWH3$i&$lKR4Br9bk{!wH4F`Xkya{o+*HkS*Re)zIpP;a_+EMKo7S8$6( z-DJi+qK>N{yPNzd`?y}Y;&nEoiIn5&Jw_hzu>W9lKp@$Ezg#&33oKR|PRf+Tet%)K hgBcd!4h$f$c}*5j~)%+dJZr9oO;WdeaG0_N&;biGgu)oE(I6qa%I;FC-I3q74DJ$j_ELrmsR z#2Tv|7O!7D(Bf#4SIEor>(UE)^na35w*-IR?~m{9J$@&vaOJd*sr502(9Jy|Hfm|b z+DQ*Y9eEUc;?8)Sxgz|smB;4zb=#Vnz1^R5-WS*R<*DWy9Z(lKZ*+G<$Mw$TX1a4f z+ZE23s?z#nPQ{f4+(Pz6v1LDdi!UZNrnmL_Wc6A2=!o5p$V(103VG!DsAEyq6#bOg zFpK=cu+yQ}_NdnlCECMGGl{x;e*Z`5AYhW{YAVDIwDKoQOY zkH}&M25w;xW@MN(M*=9wUgGKN%Knr~jzN>rIcxhv1_tKMo-U3d6}R5rvG)-UWH|m& z-brO=x4?!t6JAGYF`m07jjrvlQ)ZPkycAU?^(iqh-7tYm z(WN-7cf#%^Y>S!&8YLE7$zK0`-~1)gZx2@Am;1iFRtRV>1A~EU{BC^#*NggX8>@9r zXJzxPH)u&yW?*7qY+!I;P+*vmrtpqeq}$bPC$G1+_Zvo#m;eI@0}Db4l*rSpIP}k$H}Be+Gd-Vv{@FSCufF?4A79_O9gD(N zXQrmQu3o*GWrE4J+|?mkD+4rQvM%WhwZ7g}6dUd+kWpC~In~QGQR3U58%O_L-C$ua zRA%yVX^`i(-13qKhYUiN26fuDe6|z1_AdNzRT=+;^Ut6DuG4w{qx;zN%6VL^P0yY` z4_$rLg8PNY`OhJG(|4QwT>js7%IVa~dF~8zAN;OUV!!>_=I1_thC=^+uXlC+{Tp-r z?M{webvy#!pWiFLUYC)d8-6it#ovPX>esu||NYr|Qjzxt^QL3Dy?5lNn&xenanznz z_Pbhm~i7Ymj?mt+0(_pSL`oxIieUtK@3_w}xyFTze6ZeV|L z=t%zF9~JL*?-6Cc*eG??p*L$m_GD+N`Wp36#U*MDbEn_F6?vzxR2pdGuMcnbZrYrD z>Rj*Aq&q={#w+%15d8gQen)O$^w(BiCXc3LukCj~@5|pVwc?|dLW9biU%q$D7-h1| zX1V3f2FBndlNpjGMYmZBR?J?WoM|EY<|l&@zig^p$-i|8&l(q>ac*arr0~7O>E_LI zd!;u6EwY{Kan#TuYaL74^J6AO^iun{UynW5S^i;G@3OkOOszXS zqPcA=cRtC^Vd%|L2-W}pXAAp*{S1Bh64$RKb#o7t?XCXQw!ZD_r6ZgD7A$1k;J4u5 zafUU*83iDs0!ExLWbol@C}ra1hY^-+33CsaZSYIr-XSul0Ic@7bHZGQW@d{%pgIc< z7HDb*C1u-U*#!|gM%*ZA-68$U*56ElB7c)4b|2rg#_k((HUMWNh6hvbXM8SNGVAae PCXj%qtDnm{r-UW|>V0?= literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/table_update.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/table_update.png new file mode 100644 index 0000000000000000000000000000000000000000..171bc4f90ad39bbd653abcbdd154f28a5281b09a GIT binary patch literal 1463 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/udx.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/udx.png new file mode 100644 index 0000000000000000000000000000000000000000..59b331eec37e7b9dc871bc980fa047649cdf2a83 GIT binary patch literal 1764 zcmb7Edoo)3wC*G+aY;2u`4E?0Quk|v(Mqy0s%UAgtxJ{p zbahF0tYj=Mv7)7y31Vf$t#LVsQqrYl>DkWCzCXY7p67X=^Stl-*L%*B?@M;qgnb4B z06>%EL7*r)^CKXt3hs4^7z6;NoG3irmxRY76O$7zM8%#50FxV+Z#a7Nx)?kO^Q)tn z!5Hw<1HP5mysL}G0a$jHWet(oF%&)gGuiSJ>x_t|sBdtgusa8igCx_r@NW2#h~Vwep`O&F0la-?TUvN&wm`}uHogbByI{wHz@JPC_p zp$P*IB9+ev<_$l*5s4zoj%v%9bEitYjD@OtC*GW9!Jck>CGS~}f6o7fTdsRmsnVi# z_oxP#!8-Z8wW~O;BMBtE$2!uqz!_mJof?iYH%|s{#VUUyH20ZO#-%a$4u@Ky-QNmy zVJf2CYn`TQTfc*P0@~W%IFSvR8kZiYDjOJpjEK)@o9St1G85!gQQJGpV|S8Y0!YyV z#a~n-z1#_a{9{$~>Pr<4G|?j{1pw4_K0*n&TcM{g)lx}5M70IjLBQG&>X8@(0ALY` z;Od|LdbQ%{#R*Tne&?r3Dg|Y@LgmVHQ?LFDUA^siP;-Vi>er{0d+y=SYBy~$nYrE@ zp4SE`Qi$`0l|-{D7aKFBg?0C6X#3c$(PnTvGtMYv>3zBtV2 zgw18WA@E%=cV)!l>uPd6o<}S0oBQE0OV!myO-*fH=41~w2uPD(JXS+(AiCwbO^$Z1 z`{@$>o2Wq~(Zh5>P0qa+j3#Qq$=ZDl=lx%IX9&9B?7Pp6eT+-_%^MvZ9sUiYfw4Mu zbY@0OHb;0QRZ1YZyStC9GU}S6O3>B^Ktr{HrRpI$re|j6{s!Wl857Q5jt(o^+)Rmr zrV3T=z>t2xeiGYKqYf5XiNG#(BI$H`qjHmQWw<{iB*a%Qm%?KoFQVJE=Hu2*J6`KQ z8*NkG7pHTGdD6HvKZyr|RNwhA0^Q={Z>j_yAc20PvCN=Imlr%Xqr)8II;L2-ZoSH| z7v}B*TYh)uQCC;CnC4oBZ~^d(J2Hx9ZDV^by!#Q&RWJ8HZTawS7ij7>49V=_v3tU+ zLqL#lF8E=l3Y_W6aal;iA_3*1;^Mk5Rp8yjG!_hs1gsTc0sshr0DlRlN+2I|9se#x zb0=dBu>RlSKU@D6jXI)<9mB0vnfB^gHvrF1s0g9V%~OI+IMY`~><)r&>+DH9Ur9WD z6{eRo!6|Fc@n9M>M4x}^QyTQk-R;`95>9b{C`ec)@tew$HWJw7GZQFQjGxqW{hP2w zfe_tt)cLZ{;;v-SFiebP#RN;W%e+$CH!G?f-dgGJJT)pNr&S5QS}3`M;M(NMV@F?R zeV{jV-a>F8UE_b#WN&u+vY_LP#gAWShqBW+v{!=QzIhaD(D8$y^0BwN(@*@wLLL~m zBQeB@cd}M`7ckrZx);d+m3|W??i4A6jx(YI@rXpN>2VCR06f`i+pcOE3exA>c0!H? zfP(q-AJi>#RXo624RT~Hf>G#qxE>(!}&z$U)*35cdM+e2gLwf0^-44*b zjQ6+qc4ZcEb4gnFnt*H=ktl5|?03u>15IiW&r9XDRhlz8L6Vr6D3f-!N57Z+P0@bm zPdN4veRf+U6o3ORid+W3|A&ATZ67vRerMO*-eleV>=~^2fm_zJZ7|cbu4W$HbIQin z_BltXwYBy7O;q&b*G-&nJu&YuXHd;7>Wb znVFgD^x8Q6z$U8cRTPX3ESY=2!MenK0cQI#>+6%^YBcGBU}=jipIBvlKfNvpw?rNS zBW^*iC@$C9?@<&15eI_rdy?dU_kL3y3V3uof5?ep%3|%ACuS_LOmT)5dY~BF%qxA8 zKcJg~?2xRttoosVXb?@%X{BVTFX67-f+hN?qEL_s>Z0(y_TESwW%~})K@oodiAW|i IyM?p=1Pz+}4FCWD literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/union.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/union.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf96a9dbc314844bcf31d31cfc1f0a1aa117c20 GIT binary patch literal 883 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/images/icons/window_aggregate.png b/src/sql/workbench/contrib/queryplan2/browser/images/icons/window_aggregate.png new file mode 100644 index 0000000000000000000000000000000000000000..9f2f161c5ea5e654abbf7863263e7cb8f644396f GIT binary patch literal 1962 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 literal 0 HcmV?d00001 diff --git a/src/sql/workbench/contrib/queryplan2/browser/media/queryPlan2.css b/src/sql/workbench/contrib/queryplan2/browser/media/queryPlan2.css new file mode 100644 index 0000000000..206b41c403 --- /dev/null +++ b/src/sql/workbench/contrib/queryplan2/browser/media/queryPlan2.css @@ -0,0 +1,69 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.qp-container .query-plan { + width: 100%; + height: 500px; + position: relative; + border-top: 1px solid; +} + +.qp-container .query-plan .actionbar-container { +height: 100%; +width: 30px; +position: absolute; +top: 0px; +right: 0px; +} + +.qp-container .query-plan .properties-container { + position: absolute; + top: 0px; + right: 32px; + height: 100%; + overflow-y: scroll; + background-color: #eeeeee; + width: 510px; +} + +.qp-container .prop-table-header { + font-weight: bold; +} + +.qp-container .properties-header { + font-weight: bold; + padding: 5px; +} + +.qp-container .properties-toggle { + height: 9px; + width: 9px; + display: inline-block; +} + +.qp-container .properties-toggle .expand { + background: url(../images/expand.gif) no-repeat center center; +} + +.qp-container .properties-toggle .collapse { + background: url(../images/collapse.gif) no-repeat center center; +} + +.qp-container .mxTooltip { + -webkit-box-shadow: 3px 3px 12px #C0C0C0; + -moz-box-shadow: 3px 3px 12px #C0C0C0; + box-shadow: 3px 3px 12px #C0C0C0; + background: #FFFFCC; + border-style: solid; + border-width: 1px; + border-color: black; + font-family: Arial; + font-size: 8pt; + position: absolute; + cursor: default; + padding: 4px; + color: black; + z-index: 3; +} diff --git a/src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts b/src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts new file mode 100644 index 0000000000..7aa0194590 --- /dev/null +++ b/src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts @@ -0,0 +1,582 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/queryPlan2'; +import type * as azdata from 'azdata'; +import { IPanelView, IPanelTab } from 'sql/base/browser/ui/panel/panel'; +import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; +import { dispose } from 'vs/base/common/lifecycle'; +import { IConfigurationRegistry, Extensions as ConfigExtensions } from 'vs/platform/configuration/common/configurationRegistry'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { ActionBar, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; +import * as DOM from 'vs/base/browser/dom'; +import { PropertiesAction } from 'sql/workbench/contrib/queryplan2/browser/actions/propertiesAction'; +import * as azdataGraphModule from 'azdataGraph'; +import { escape } from 'sql/base/common/strings'; +let azdataGraph = azdataGraphModule(); + +export class QueryPlan2Tab implements IPanelTab { + public readonly title = localize('queryPlanTitle', "Query Plan"); + public readonly identifier = 'QueryPlan2Tab'; + public readonly view: QueryPlan2View; + + constructor() { + this.view = new QueryPlan2View(); + } + + public dispose() { + dispose(this.view); + } + + public clear() { + this.view.clear(); + } +} + +export class QueryPlan2View implements IPanelView { + private _qps?: QueryPlan2[] = []; + private _graphs?: azdata.QueryPlanGraph[] = []; + private _container = DOM.$('.qp-container'); + + public render(container: HTMLElement): void { + container.appendChild(this._container); + this._container.style.overflow = 'scroll'; + } + + dispose() { + this._container.remove(); + delete this._qps; + delete this._graphs; + } + + public layout(dimension: DOM.Dimension): void { + this._container.style.width = dimension.width + 'px'; + this._container.style.height = dimension.height + 'px'; + } + + public clear() { + this._qps = []; + this._graphs = []; + DOM.clearNode(this._container); + } + + public addGraphs(newGraphs: azdata.QueryPlanGraph[]) { + newGraphs.forEach(g => { + const qp2 = new QueryPlan2(this._container, this._qps.length + 1); + qp2.graph = g; + this._qps.push(qp2); + this._graphs.push(g); + this.updateRelativeCosts(); + }); + } + + private updateRelativeCosts() { + const sum = this._graphs.reduce((prevCost: number, cg) => { + return prevCost += cg.root.subTreeCost + cg.root.cost; + }, 0); + + if (sum > 0) { + this._qps.forEach(qp => { + qp.relativeCost = ((qp.graph.root.subTreeCost + qp.graph.root.cost) / sum) * 100; + }); + } + } +} + +export class QueryPlan2 { + private _graph?: azdata.QueryPlanGraph; + private _relativeCost?: globalThis.Text; + private _actionBar: ActionBar; + private _table: Slick.Grid; + private _dataView: Slick.Data.DataView; + private _container: HTMLElement; + private _actionBarContainer: HTMLElement; + private _data: any[]; + private _iconMap: any = new Object(); + private _iconPaths: any = new Object(); + + public propContainer: HTMLElement; + + constructor( + parent: HTMLElement, + private _graphIndex: number, + + ) { + this._container = DOM.$('.query-plan'); + parent.appendChild(this._container); + + + this._actionBarContainer = DOM.$('.actionbar-container'); + this._actionBar = new ActionBar(this._actionBarContainer, { + orientation: ActionsOrientation.VERTICAL, context: this + }); + + this.propContainer = DOM.$('.properties-container'); + const propHeader = document.createElement('div'); + propHeader.className = 'properties-header'; + propHeader.innerText = 'Properties'; + this.propContainer.appendChild(propHeader); + + this.propContainer.style.visibility = 'hidden'; + + this._dataView = new Slick.Data.DataView({ inlineFilters: false }); + let self = this; + this._data = []; + const TaskNameFormatter = function (row, cell, value, columnDef, dataContext) { + value = escape(value); + const spacer = ''; + const idx = self._dataView.getIdxById(dataContext.id); + if (self._data[idx + 1] && self._data[idx + 1].indent > self._data[idx].indent) { + if (dataContext._collapsed) { + return spacer + ' ' + value; + } else { + return spacer + ' ' + value; + } + } else { + return spacer + ' ' + value; + } + }; + + const columns: Slick.Column[] = [ + { + id: 'name', + name: 'Name', + field: 'name', + width: 250, + editor: Slick.Editors.Text, + formatter: TaskNameFormatter, + headerCssClass: 'prop-table-header' + }, + { + id: 'value', + name: 'Value', + field: 'propValue', + width: 250, + editor: Slick.Editors.Text, + headerCssClass: 'prop-table-header' + } + ]; + + const options: Slick.GridOptions = { + editable: false, + enableAddRow: false, + enableCellNavigation: true, + autoHeight: true + }; + + const tableContainer = DOM.$('.table-container'); + tableContainer.style.height = '500px'; + tableContainer.style.width = '490px'; + this.propContainer.appendChild(tableContainer); + this._table = new Slick.Grid(tableContainer, this._dataView, columns, options); + + this._table.onClick.subscribe((e: any, args) => { + + const item = this._dataView.getItem(args.row); + if (item) { + item._collapsed = !item._collapsed; + this._dataView.updateItem(item.id, item); + } + e.stopImmediatePropagation(); + }); + + this._dataView.setFilter((item) => { + if (item.parent !== null) { + let parent = this._data[item.parent]; + while (parent) { + if (parent._collapsed) { + return false; + } + + parent = this._data[parent.parent]; + } + } + return true; + }); + + + // wire up model events to drive the grid + this._dataView.onRowCountChanged.subscribe((e, args) => { + this._table.updateRowCount(); + this._table.render(); + }); + + this._dataView.onRowsChanged.subscribe((e, args) => { + this._table.invalidateRows(args.rows); + this._table.render(); + }); + + const actions = [ + new PropertiesAction() + ]; + this._actionBar.push(actions, { icon: true, label: false }); + + this._iconMap['Adaptive_Join_32x.ico'] = 'adaptiveJoin'; + this._iconMap['Assert_32x.ico'] = 'assert'; + this._iconMap['Bitmap_32x.ico'] = 'bitmap'; + this._iconMap['Clustered_index_delete_32x.ico'] = 'clusteredIndexDelete'; + this._iconMap['Clustered_index_insert_32x.ico'] = 'ClusteredIndexInsert'; + this._iconMap['Clustered_index_scan_32x.ico'] = 'ClusteredIndexScan'; + this._iconMap['Clustered_index_seek_32x.ico'] = 'ClusteredIndexSeek'; + this._iconMap['Clustered_index_update_32x.ico'] = 'ClusteredIndexUpdate'; + this._iconMap['Clustered_index_merge_32x.icoo'] = 'ClusteredIndexMerge'; + + + this._iconMap['Filter_32x.ico'] = 'filter'; + this._iconMap['Clustered_index_scan_32x.ico'] = 'clusteredIndexScan'; + this._iconMap['Clustered_index_seek_32x.ico'] = 'clusteredIndexSeek'; + this._iconMap['Compute_scalar_32x.ico'] = 'computeScalar'; + this._iconMap['Concatenation_32x.ico'] = 'concatenation'; + + this._iconMap['Concatenation_32x.ico'] = 'concatenation'; + + this._iconMap['Nested_loops_32x.ico'] = 'nestedLoops'; + this._iconMap['Result_32x.ico'] = 'result'; + this._iconMap['Table_spool_32x.ico'] = 'tableSpool'; + this._iconMap['Top_32x.ico'] = 'top'; + let imageBasePath = URI.parse(decodeURI(require.toUrl('./images/icons/'))).fsPath; + this._iconPaths = + { + // generic icons + iteratorCatchAll: imageBasePath + 'iterator_catch_all.png', + + cursorCatchAll: imageBasePath + 'cursor_catch_all.png', + + languageConstructCatchAll: imageBasePath + 'language_construct_catch_all.png', + + // operator icons + adaptiveJoin: imageBasePath + 'adaptive_join.png', + + assert: imageBasePath + 'assert.png', + + bitmap: imageBasePath + 'bitmap.png', + + clusteredIndexDelete: imageBasePath + 'clustered_index_delete.png', + + clusteredIndexInsert: imageBasePath + 'clustered_index_insert.png', + + clusteredIndexScan: imageBasePath + 'clustered_index_scan.png', + + clusteredIndexSeek: imageBasePath + 'clustered_index_seek.png', + + clusteredIndexUpdate: imageBasePath + 'clustered_index_update.png', + + clusteredIndexMerge: imageBasePath + 'clustered_index_merge.png', + + clusteredUpdate: imageBasePath + 'clustered_update.png', + + collapse: imageBasePath + 'collapse.png', + + computeScalar: imageBasePath + 'compute_scalar.png', + + concatenation: imageBasePath + 'concatenation.png', + + constantScan: imageBasePath + 'constant_scan.png', + + deletedScan: imageBasePath + 'deleted_scan.png', + + filter: imageBasePath + 'filter.png', + + hashMatch: imageBasePath + 'hash_match.png', + + indexDelete: imageBasePath + 'index_delete.png', + + indexInsert: imageBasePath + 'index_insert.png', + + indexScan: imageBasePath + 'index_scan.png', + + columnstoreIndexDelete: imageBasePath + 'columnstore_index_delete.png', + + columnstoreIndexInsert: imageBasePath + 'columnstore_index_insert.png', + + columnstoreIndexMerge: imageBasePath + 'columnstore_index_merge.png', + + columnstoreIndexScan: imageBasePath + 'columnstore_index_scan.png', + + columnstoreIndexUpdate: imageBasePath + 'columnstore_index_update.png', + + indexSeek: imageBasePath + 'index_seek.png', + + indexSpool: imageBasePath + 'index_spool.png', + + indexUpdate: imageBasePath + 'index_update.png', + + insertedScan: imageBasePath + 'inserted_scan.png', + + logRowScan: imageBasePath + 'log_row_scan.png', + + mergeInterval: imageBasePath + 'merge_interval.png', + + mergeJoin: imageBasePath + 'merge_join.png', + + nestedLoops: imageBasePath + 'nested_loops.png', + + parallelism: imageBasePath + 'parallelism.png', + + parameterTableScan: imageBasePath + 'parameter_table_scan.png', + + print: imageBasePath + 'print.png', + + rank: imageBasePath + 'rank.png', + + foreignKeyReferencesCheck: imageBasePath + 'foreign_key_references_check.png', + + remoteDelete: imageBasePath + 'remote_delete.png', + + remoteIndexScan: imageBasePath + 'remote_index_scan.png', + + remoteIndexSeek: imageBasePath + 'remote_index_seek.png', + + remoteInsert: imageBasePath + 'remote_insert.png', + + remoteQuery: imageBasePath + 'remote_query.png', + + remoteScan: imageBasePath + 'remote_scan.png', + + remoteUpdate: imageBasePath + 'remote_update.png', + + ridLookup: imageBasePath + 'rid_lookup.png', + + rowCountSpool: imageBasePath + 'row_count_spool.png', + + segment: imageBasePath + 'segment.png', + + sequence: imageBasePath + 'sequence.png', + + sequenceProject: imageBasePath + 'sequence_project.png', + + sort: imageBasePath + 'sort.png', + + split: imageBasePath + 'split.png', + + streamAggregate: imageBasePath + 'stream_aggregate.png', + + switchStatement: imageBasePath + 'switch.png', + + tableValuedFunction: imageBasePath + 'table_valued_function.png', + + tableDelete: imageBasePath + 'table_delete.png', + + tableInsert: imageBasePath + 'table_insert.png', + + tableScan: imageBasePath + 'table_scan.png', + + tableSpool: imageBasePath + 'table_spool.png', + + tableUpdate: imageBasePath + 'table_update.png', + + tableMerge: imageBasePath + 'table_merge.png', + + tfp: imageBasePath + 'predict.png', + + top: imageBasePath + 'top.png', + + udx: imageBasePath + 'udx.png', + + batchHashTableBuild: imageBasePath + 'batch_hash_table_build.png', + + windowSpool: imageBasePath + 'table_spool.png', + + windowAggregate: imageBasePath + 'window_aggregate.png', + + // cursor operators + fetchQuery: imageBasePath + 'fetch_query.png', + + populateQuery: imageBasePath + 'population_query.png', + + refreshQuery: imageBasePath + 'refresh_query.png', + + // shiloh operators + result: imageBasePath + 'result.png', + + aggregate: imageBasePath + 'aggregate.png', + + assign: imageBasePath + 'assign.png', + + arithmeticExpression: imageBasePath + 'arithmetic_expression.png', + + bookmarkLookup: imageBasePath + 'bookmark_lookup.png', + + convert: imageBasePath + 'convert.png', + + declare: imageBasePath + 'declare.png', + + deleteOperator: imageBasePath + 'delete.png', + + dynamic: imageBasePath + 'dynamic.png', + + hashMatchRoot: imageBasePath + 'hash_match_root.png', + + hashMatchTeam: imageBasePath + 'hash_match_team.png', + + ifOperator: imageBasePath + 'if.png', + + insert: imageBasePath + 'insert.png', + + intrinsic: imageBasePath + 'intrinsic.png', + + keyset: imageBasePath + 'keyset.png', + + locate: imageBasePath + 'locate.png', + + populationQuery: imageBasePath + 'population_query.png', + + setFunction: imageBasePath + 'set_function.png', + + snapshot: imageBasePath + 'snapshot.png', + + spool: imageBasePath + 'spool.png', + + tsql: imageBasePath + 'sql.png', + + update: imageBasePath + 'update.png', + + // fake operators + keyLookup: imageBasePath + 'bookmark_lookup.png', + + // PDW operators + apply: imageBasePath + 'apply.png', + + broadcast: imageBasePath + 'broadcast.png', + + computeToControlNode: imageBasePath + 'compute_to_control_node.png', + + constTableGet: imageBasePath + 'const_table_get.png', + + controlToComputeNodes: imageBasePath + 'control_to_compute_nodes.png', + + externalBroadcast: imageBasePath + 'external_broadcast.png', + + externalExport: imageBasePath + 'external_export.png', + + externalLocalStreaming: imageBasePath + 'external_local_streaming.png', + + externalRoundRobin: imageBasePath + 'external_round_robin.png', + + externalShuffle: imageBasePath + 'external_shuffle.png', + + get: imageBasePath + 'get.png', + + groupByApply: imageBasePath + 'apply.png', + + groupByAggregate: imageBasePath + 'group_by_aggregate.png', + + join: imageBasePath + 'join.png', + + localCube: imageBasePath + 'intrinsic.png', + + project: imageBasePath + 'project.png', + + shuffle: imageBasePath + 'shuffle.png', + + singleSourceRoundRobin: imageBasePath + 'single_source_round_robin.png', + + singleSourceShuffle: imageBasePath + 'single_source_shuffle.png', + + trim: imageBasePath + 'trim.png', + + union: imageBasePath + 'union.png', + + unionAll: imageBasePath + 'union_all.png' + }; + } + + private populate(node: azdata.QueryPlanGraphNode, diagramNode: any): any { + + diagramNode.label = node.name; + if (node.properties && node.properties.length > 0) { + diagramNode.metrics = node.properties.map(e => { return { name: e.name, value: e.formattedValue.substring(0, 75) }; }); + } + + let icon = this._iconMap[node.type]; + if (icon) { + diagramNode.icon = icon; + } + + if (node.children) { + diagramNode.children = []; + for (let i = 0; i < node.children.length; ++i) { + diagramNode.children.push(this.populate(node.children[i], new Object())); + } + } + return diagramNode; + } + + private createPlanDiagram(container: HTMLDivElement): void { + let diagramRoot: any = new Object(); + let graphRoot: azdata.QueryPlanGraphNode = this._graph.root; + this.populate(graphRoot, diagramRoot); + + new azdataGraph.azdataQueryPlan(container, diagramRoot, this._iconPaths); + } + + + public set graph(graph: azdata.QueryPlanGraph | undefined) { + this._graph = graph; + if (this._graph) { + this._container.appendChild(document.createTextNode(localize('queryIndex', "Query {0}: ", this._graphIndex))); + this._relativeCost = document.createTextNode(localize('relativeToTheScript', "(relative to the script):")); + this._container.appendChild(this._relativeCost); + this._container.appendChild(document.createElement('br')); + this._container.appendChild(document.createTextNode(`${graph.query}`)); + let diagramContainer = document.createElement('div'); + this.createPlanDiagram(diagramContainer); + this._container.appendChild(diagramContainer); + + this._container.appendChild(this.propContainer); + this.setData(this._graph.root.properties); + this._container.appendChild(this._actionBarContainer); + } + } + + public get graph(): azdata.QueryPlanGraph | undefined { + return this._graph; + } + + public set relativeCost(newCost: number) { + this._relativeCost.nodeValue = localize('relativeToTheScriptWithCost', "(relative to the script): {0}%", newCost.toFixed(2)); + } + + public setData(props: azdata.QueryPlanGraphElementProperty[]): void { + this._data = []; + props.forEach((p, i) => { + this._data.push({ + id: p.name, + name: p.name, + propValue: p.formattedValue, + _collapsed: true + }); + }); + this._dataView.beginUpdate(); + this._dataView.setItems(this._data); + this._dataView.endUpdate(); + this._dataView.refresh(); + this._table.autosizeColumns(); + this._table.updateRowCount(); + this._table.resizeCanvas(); + this._table.render(); + } +} + +/** + * Registering a feature flag for query plan. + * TODO: This should be removed before taking the feature to public preview. + */ +const QUERYPLAN2_CONFIG_ID = 'queryPlan2'; +Registry.as(ConfigExtensions.Configuration).registerConfiguration({ + id: QUERYPLAN2_CONFIG_ID, + title: localize('queryPlan2.configTitle', "Query Plan"), + type: 'object', + properties: { + 'queryPlan2.enableFeature': { + 'type': 'boolean', + 'default': false, + 'description': localize('queryPlan2.featureEnabledDescription', "Controls whether the new query plan feature is enabled. Default value is false.") + } + } +}); + + diff --git a/src/sql/workbench/services/query/common/queryManagement.ts b/src/sql/workbench/services/query/common/queryManagement.ts index a7b9e80256..bc17ee044a 100644 --- a/src/sql/workbench/services/query/common/queryManagement.ts +++ b/src/sql/workbench/services/query/common/queryManagement.ts @@ -17,6 +17,7 @@ import { ResultSetSubset } from 'sql/workbench/services/query/common/query'; import { isUndefined } from 'vs/base/common/types'; import { ILogService } from 'vs/platform/log/common/log'; import * as nls from 'vs/nls'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export const SERVICE_ID = 'queryManagementService'; @@ -119,7 +120,8 @@ export class QueryManagementService implements IQueryManagementService { constructor( @IConnectionManagementService private _connectionService: IConnectionManagementService, @IAdsTelemetryService private _telemetryService: IAdsTelemetryService, - @ILogService private _logService: ILogService + @ILogService private _logService: ILogService, + @IConfigurationService private _configurationService: IConfigurationService ) { } @@ -329,6 +331,9 @@ export class QueryManagementService implements IQueryManagementService { public onResultSetUpdated(resultSetInfo: azdata.QueryExecuteResultSetNotificationParams): void { this._notify(resultSetInfo.ownerUri, (runner: QueryRunner) => { runner.handleResultSetUpdated(resultSetInfo.resultSetSummary); + if (resultSetInfo.executionPlans && this._configurationService.getValue('queryPlan2.enableFeature')) { + runner.handleQueryPlan2Available(resultSetInfo.executionPlans); + } }); } diff --git a/src/sql/workbench/services/query/common/queryModel.ts b/src/sql/workbench/services/query/common/queryModel.ts index 374998cdd1..3d2fdf6091 100644 --- a/src/sql/workbench/services/query/common/queryModel.ts +++ b/src/sql/workbench/services/query/common/queryModel.ts @@ -15,7 +15,8 @@ import { EditCreateRowResult, EditRevertCellResult, ExecutionPlanOptions, - queryeditor + queryeditor, + QueryPlanGraph } from 'azdata'; import { QueryInfo } from 'sql/workbench/services/query/common/queryModelService'; import { IRange } from 'vs/editor/common/core/range'; @@ -30,6 +31,12 @@ export interface IQueryPlanInfo { planXml: string; } +export interface IQueryPlan2Info { + providerId: string; + fileUri: string; + planGraphs: QueryPlanGraph[]; +} + export interface IQueryInfo { range: IRange[]; messages: IQueryMessage[]; diff --git a/src/sql/workbench/services/query/common/queryModelService.ts b/src/sql/workbench/services/query/common/queryModelService.ts index 9b38a5fa4e..1733ec1605 100644 --- a/src/sql/workbench/services/query/common/queryModelService.ts +++ b/src/sql/workbench/services/query/common/queryModelService.ts @@ -352,6 +352,21 @@ export class QueryModelService implements IQueryModelService { this._onQueryEvent.fire(event); }); + queryRunner.onQueryPlan2Available(qp2Info => { + // fire extensibility API event + let event: IQueryEvent = { + type: 'executionPlan', + uri: qp2Info.fileUri, + queryInfo: + { + range: info.range!, + messages: info.queryRunner!.messages + }, + params: qp2Info.planGraphs + }; + this._onQueryEvent.fire(event); + }); + queryRunner.onVisualize(resultSetInfo => { let event: IQueryEvent = { type: 'visualize', diff --git a/src/sql/workbench/services/query/common/queryRunner.ts b/src/sql/workbench/services/query/common/queryRunner.ts index e946b12f01..673776d435 100644 --- a/src/sql/workbench/services/query/common/queryRunner.ts +++ b/src/sql/workbench/services/query/common/queryRunner.ts @@ -6,9 +6,10 @@ import { IQueryManagementService, QueryCancelResult, ExecutionPlanOptions } from 'sql/workbench/services/query/common/queryManagement'; import * as Utils from 'sql/platform/connection/common/utils'; import { Deferred } from 'sql/base/common/promise'; -import { IQueryPlanInfo } from 'sql/workbench/services/query/common/queryModel'; +import { IQueryPlanInfo, IQueryPlan2Info } from 'sql/workbench/services/query/common/queryModel'; import { ResultSerializer, SaveFormat } from 'sql/workbench/services/query/common/resultSerializer'; +import * as azdata from 'azdata'; import * as nls from 'vs/nls'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import * as types from 'vs/base/common/types'; @@ -72,6 +73,9 @@ export default class QueryRunner extends Disposable { private readonly _onQueryPlanAvailable = this._register(new Emitter()); public readonly onQueryPlanAvailable = this._onQueryPlanAvailable.event; + private readonly _onQueryPlan2Available = this._register(new Emitter()); + public readonly onQueryPlan2Available = this._onQueryPlan2Available.event; + private readonly _onVisualize = this._register(new Emitter()); public readonly onVisualize = this._onVisualize.event; @@ -383,6 +387,16 @@ export default class QueryRunner extends Disposable { } } + public handleQueryPlan2Available(queryPlans: azdata.QueryPlanGraph[] | undefined) { + if (queryPlans) { + this._onQueryPlan2Available.fire({ + providerId: mssqlProviderName, + fileUri: this.uri, + planGraphs: queryPlans + }); + } + } + /** * Handle a Mssage from the service layer */ diff --git a/src/typings/azdataGraph.d.ts b/src/typings/azdataGraph.d.ts new file mode 100644 index 0000000000..2257f76bc3 --- /dev/null +++ b/src/typings/azdataGraph.d.ts @@ -0,0 +1,9 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare class azdataQueryPlan { + public isEnabled(): number; + public init(): void; +} diff --git a/yarn.lock b/yarn.lock index 6349d5ef26..9395bdb52c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1831,6 +1831,10 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +"azdataGraph@github:Microsoft/azdataGraph#0.0.5": + version "0.0.5" + resolved "https://codeload.github.com/Microsoft/azdataGraph/tar.gz/7812950d661758016962897ec4704a39b118b001" + azure-storage@^2.10.2: version "2.10.2" resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.10.2.tgz#3bcabdbf10e72fd0990db81116e49023c4a675b6"