diff --git a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTY0NDkzMjUwNQ== b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTY0NDkzMjUwNQ==
index 3df5156edd9a..8abba23e4a6c 100755
--- a/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTY0NDkzMjUwNQ==
+++ b/.aspect/rules/external_repository_action_cache/npm_translate_lock_LTY0NDkzMjUwNQ==
@@ -1,6 +1,6 @@
# Input hashes for repository rule npm_translate_lock(name = "npm_db_console", pnpm_lock = "//pkg/ui/workspaces/db-console:pnpm-lock.yaml").
# This file should be checked into version control along with the pnpm-lock.yaml file.
pkg/ui/.npmrc.pnpm=1714720514
-pkg/ui/workspaces/db-console/pnpm-lock.yaml=307741782
-pkg/ui/workspaces/db-console/yarn.lock=1296929611
-pkg/ui/workspaces/db-console/package.json=-1415963323
+pkg/ui/workspaces/db-console/pnpm-lock.yaml=1591164581
+pkg/ui/workspaces/db-console/yarn.lock=861579387
+pkg/ui/workspaces/db-console/package.json=463935330
diff --git a/pkg/cmd/dev/ui.go b/pkg/cmd/dev/ui.go
index d7ee6f66c3cf..ff9de9a447e6 100644
--- a/pkg/cmd/dev/ui.go
+++ b/pkg/cmd/dev/ui.go
@@ -42,6 +42,7 @@ func makeUICmd(d *dev) *cobra.Command {
uiCmd.AddCommand(makeUIWatchCmd(d))
uiCmd.AddCommand(makeUIE2eCmd(d))
uiCmd.AddCommand(makeMirrorDepsCmd(d))
+ uiCmd.AddCommand(makeUIStorybookCmd(d))
return uiCmd
}
@@ -225,6 +226,118 @@ Replaces 'make ui-watch'.`,
return watchCmd
}
+// makeUIStorybookCmd initializes the 'ui storybook' subcommand, which runs
+// storybook for either db-console or cluster-ui projects.
+func makeUIStorybookCmd(d *dev) *cobra.Command {
+ const (
+ // projectFlag indicates whether storybook should be run for db-console or
+ // cluster-ui projects
+ projectFlag = "project"
+ // portFlag defines the port to run Storybook
+ portFlag = "port"
+ )
+
+ storybookCmd := &cobra.Command{
+ Use: "storybook",
+ Short: "Runs Storybook in watch mode",
+ Long: ``,
+ Args: cobra.MinimumNArgs(0),
+ RunE: func(cmd *cobra.Command, commandLine []string) error {
+ // Create a context that cancels when OS signals come in.
+ ctx, stop := signal.NotifyContext(d.cli.Context(), os.Interrupt, os.Kill)
+ defer stop()
+
+ // Fetch all node dependencies (through Bazel) to ensure things are up-to-date
+ err := d.exec.CommandContextInheritingStdStreams(
+ ctx,
+ "bazel",
+ "fetch",
+ "//pkg/ui/workspaces/cluster-ui:cluster-ui",
+ "//pkg/ui/workspaces/db-console:db-console-ccl",
+ )
+ if err != nil {
+ log.Fatalf("failed to fetch node dependencies: %v", err)
+ }
+
+ // Build prerequisites for Storybook. It runs Db Console with CCL license.
+ args := []string{
+ "build",
+ "//pkg/ui/workspaces/cluster-ui:cluster-ui",
+ "//pkg/ui/workspaces/db-console/ccl/src/js:crdb-protobuf-client-ccl",
+ }
+
+ logCommand("bazel", args...)
+ err = d.exec.CommandContextInheritingStdStreams(ctx, "bazel", args...)
+ if err != nil {
+ log.Fatalf("failed to build UI watch prerequisites: %v", err)
+ return err
+ }
+
+ if err := arrangeFilesForWatchers(d /* ossOnly */, false); err != nil {
+ log.Fatalf("failed to arrange files for watchers: %v", err)
+ return err
+ }
+
+ dirs, err := getUIDirs(d)
+ if err != nil {
+ log.Fatalf("unable to find cluster-ui and db-console directories: %v", err)
+ return err
+ }
+
+ portNumber, err := cmd.Flags().GetInt16(portFlag)
+ if err != nil {
+ log.Fatalf("unexpected error: %v", err)
+ return err
+ }
+ port := fmt.Sprint(portNumber)
+
+ project, err := cmd.Flags().GetString(projectFlag)
+ if err != nil {
+ log.Fatalf("unexpected error: %v", err)
+ return err
+ }
+
+ projectToPath := map[string]string{
+ "db-console": dirs.dbConsole,
+ "cluster-ui": dirs.clusterUI,
+ }
+
+ cwd, ok := projectToPath[project]
+ if !ok {
+ err = fmt.Errorf("unexpected project name (%s) provided with --project flag", project)
+ log.Fatalf("%v", err)
+ return err
+ }
+
+ nbExec := d.exec.AsNonBlocking()
+
+ args = []string{
+ "--silent",
+ "--cwd", cwd,
+ "start-storybook",
+ "-p", port,
+ }
+
+ err = nbExec.CommandContextInheritingStdStreams(ctx, "yarn", args...)
+ if err != nil {
+ log.Fatalf("Unable to run Storybook for %s : %v", project, err)
+ return err
+ }
+
+ // Wait for OS signals to cancel if we're not in test-mode.
+ if !d.exec.IsDryrun() {
+ <-ctx.Done()
+ }
+ return nil
+ },
+ }
+
+ storybookCmd.Flags().Int16P(portFlag, "p", 6006, "port to run Storybook")
+ storybookCmd.Flags().String(projectFlag, "db-console", "db-console, cluster-ui")
+
+ return storybookCmd
+}
+
func makeUILintCmd(d *dev) *cobra.Command {
const (
verboseFlag = "verbose"
diff --git a/pkg/sql/backfill/mvcc_index_merger.go b/pkg/sql/backfill/mvcc_index_merger.go
index b1fc9b7414e5..86b05a4ac816 100644
--- a/pkg/sql/backfill/mvcc_index_merger.go
+++ b/pkg/sql/backfill/mvcc_index_merger.go
@@ -136,11 +136,18 @@ func (ibm *IndexBackfillMerger) Run(ctx context.Context, output execinfra.RowRec
return prog
}
+ var outputMu syncutil.Mutex
pushProgress := func() {
p := getStoredProgressForPush()
if p.CompletedSpans != nil {
log.VEventf(ctx, 2, "sending coordinator completed spans: %+v", p.CompletedSpans)
}
+ // Even though the contract of execinfra.RowReceiver says that Push is
+ // thread-safe, in reality it's not always the case, so we protect it
+ // with a mutex. At the time of writing, the only source of concurrency
+ // for Push()ing is present due to testing knobs though.
+ outputMu.Lock()
+ defer outputMu.Unlock()
output.Push(nil, &execinfrapb.ProducerMetadata{BulkProcessorProgress: &p})
}
diff --git a/pkg/sql/execinfra/base.go b/pkg/sql/execinfra/base.go
index 848c5ea4ec8f..c8c42562d58c 100644
--- a/pkg/sql/execinfra/base.go
+++ b/pkg/sql/execinfra/base.go
@@ -92,6 +92,9 @@ type RowReceiver interface {
// and they might not all be aware of the last status returned).
//
// Implementations of Push() must be thread-safe.
+ // TODO(yuzefovich): some implementations (DistSQLReceiver and
+ // copyingRowReceiver) are not actually thread-safe. Figure out whether we
+ // want to fix them or to update the contract.
Push(row rowenc.EncDatumRow, meta *execinfrapb.ProducerMetadata) ConsumerStatus
}
diff --git a/pkg/ui/workspaces/cluster-ui/src/barCharts/barCharts.stories.tsx b/pkg/ui/workspaces/cluster-ui/src/barCharts/barCharts.stories.tsx
index bd91b7b1ed51..0a1b3aadbbe3 100644
--- a/pkg/ui/workspaces/cluster-ui/src/barCharts/barCharts.stories.tsx
+++ b/pkg/ui/workspaces/cluster-ui/src/barCharts/barCharts.stories.tsx
@@ -22,7 +22,8 @@ import {
import statementsPagePropsFixture from "src/statementsPage/statementsPage.fixture";
import Long from "long";
-const { statements } = statementsPagePropsFixture;
+const statements =
+ statementsPagePropsFixture.statementsResponse.data.statements;
const withinColumn =
(width = "150px"): DecoratorFn =>
diff --git a/pkg/ui/workspaces/cluster-ui/src/statementsPage/statementsPage.stories.tsx b/pkg/ui/workspaces/cluster-ui/src/statementsPage/statementsPage.stories.tsx
index 7913b863e805..e7739b2e2fdd 100644
--- a/pkg/ui/workspaces/cluster-ui/src/statementsPage/statementsPage.stories.tsx
+++ b/pkg/ui/workspaces/cluster-ui/src/statementsPage/statementsPage.stories.tsx
@@ -24,9 +24,7 @@ storiesOf("StatementsPage", module)
{storyFn()}
))
.add("with data", () => )
- .add("without data", () => (
-
- ))
+ .add("without data", () => )
.add("with empty search result", () => {
const props = cloneDeep(statementsPagePropsFixture);
const { history } = props;
@@ -37,19 +35,13 @@ storiesOf("StatementsPage", module)
);
})
.add("with error", () => {
- return (
-
- );
+ return ;
})
.add("with loading state", () => {
- return ;
+ return ;
});
diff --git a/pkg/ui/workspaces/cluster-ui/src/statementsTable/statementsTable.stories.tsx b/pkg/ui/workspaces/cluster-ui/src/statementsTable/statementsTable.stories.tsx
index 602bed6f39d8..e690f97933d7 100644
--- a/pkg/ui/workspaces/cluster-ui/src/statementsTable/statementsTable.stories.tsx
+++ b/pkg/ui/workspaces/cluster-ui/src/statementsTable/statementsTable.stories.tsx
@@ -17,17 +17,19 @@ import {
} from "./statementsTable";
import statementsPagePropsFixture from "src/statementsPage/statementsPage.fixture";
import { calculateTotalWorkload } from "src/util";
+import { convertRawStmtsToAggregateStatistics } from "../sqlActivity/util";
-const { statements } = statementsPagePropsFixture;
+const statements =
+ statementsPagePropsFixture.statementsResponse.data.statements;
storiesOf("StatementsSortedTable", module)
.addDecorator(storyFn => {storyFn()})
.add("with data", () => (
(
))
.add("with loading indicator", () => (
@@ -60,9 +60,6 @@ storiesOf("Transactions Details", module)
{...routeProps}
timeScale={timeScale}
transactionFingerprintId={transactionFingerprintId.toString()}
- transaction={null}
- isLoading={true}
- statements={undefined}
nodeRegions={nodeRegions}
isTenant={false}
hasViewActivityRedactedRole={false}
@@ -71,11 +68,16 @@ storiesOf("Transactions Details", module)
refreshUserSQLRoles={noop}
onTimeScaleChange={noop}
refreshNodes={noop}
- lastUpdated={moment("0001-01-01T00:00:00Z")}
refreshTransactionInsights={noop}
limit={100}
reqSortSetting={StatsSortOptions.SERVICE_LAT}
- isDataValid={true}
+ txnStatsResp={{
+ lastUpdated: moment(),
+ error: null,
+ inFlight: false,
+ valid: true,
+ data: transactionDetailsData,
+ }}
/>
))
.add("with error alert", () => (
@@ -83,11 +85,7 @@ storiesOf("Transactions Details", module)
{...routeProps}
timeScale={timeScale}
transactionFingerprintId={undefined}
- transaction={undefined}
- isLoading={false}
- statements={undefined}
nodeRegions={nodeRegions}
- error={error}
isTenant={false}
hasViewActivityRedactedRole={false}
transactionInsights={undefined}
@@ -95,11 +93,16 @@ storiesOf("Transactions Details", module)
refreshUserSQLRoles={noop}
onTimeScaleChange={noop}
refreshNodes={noop}
- lastUpdated={moment("0001-01-01T00:00:00Z")}
refreshTransactionInsights={noop}
limit={100}
reqSortSetting={StatsSortOptions.SERVICE_LAT}
- isDataValid={true}
+ txnStatsResp={{
+ lastUpdated: moment(),
+ error: null,
+ inFlight: false,
+ valid: true,
+ data: transactionDetailsData,
+ }}
/>
))
.add("No data for this time frame; no cached transaction text", () => {
@@ -108,9 +111,6 @@ storiesOf("Transactions Details", module)
{...routeProps}
timeScale={timeScale}
transactionFingerprintId={transactionFingerprintId.toString()}
- transaction={undefined}
- isLoading={false}
- statements={transactionDetailsData.statements}
nodeRegions={nodeRegions}
isTenant={false}
hasViewActivityRedactedRole={false}
@@ -119,11 +119,16 @@ storiesOf("Transactions Details", module)
refreshUserSQLRoles={noop}
onTimeScaleChange={noop}
refreshNodes={noop}
- lastUpdated={moment("0001-01-01T00:00:00Z")}
refreshTransactionInsights={noop}
limit={100}
reqSortSetting={StatsSortOptions.SERVICE_LAT}
- isDataValid={true}
+ txnStatsResp={{
+ lastUpdated: moment(),
+ error: null,
+ inFlight: false,
+ valid: true,
+ data: transactionDetailsData,
+ }}
/>
);
});
diff --git a/pkg/ui/workspaces/db-console/.storybook/webpack.config.js b/pkg/ui/workspaces/db-console/.storybook/webpack.config.js
index 781378e33164..771c1b3ed13b 100644
--- a/pkg/ui/workspaces/db-console/.storybook/webpack.config.js
+++ b/pkg/ui/workspaces/db-console/.storybook/webpack.config.js
@@ -8,7 +8,8 @@
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
-const custom = require("../webpack.app.js");
+const custom = require("../webpack.config");
+const path = require("path");
const appConfig = custom({dist: "ccl"}, {mode: "development"});
@@ -17,8 +18,13 @@ module.exports = async ({ config, mode }) => {
...config,
resolve: {
...config.resolve,
- modules: appConfig.resolve.modules,
+ modules: [
+ path.resolve(__dirname, "..", "ccl"),
+ path.resolve(__dirname, ".."),
+ "node_modules",
+ ],
extensions: appConfig.resolve.extensions,
+ alias: appConfig.resolve.alias,
},
module: {
rules: [
diff --git a/pkg/ui/workspaces/db-console/package.json b/pkg/ui/workspaces/db-console/package.json
index 2a90998fe2b3..22168a69c39f 100644
--- a/pkg/ui/workspaces/db-console/package.json
+++ b/pkg/ui/workspaces/db-console/package.json
@@ -119,6 +119,7 @@
"chai": "^4.1.0",
"chalk": "^1.1.3",
"copy-webpack-plugin": "^4.5.1",
+ "core-js": "^3.0.1",
"css-loader": "^3.4.0",
"d3": "<4.0.0",
"d3-geo-projection": "^2.5.0",
diff --git a/pkg/ui/workspaces/db-console/pnpm-lock.yaml b/pkg/ui/workspaces/db-console/pnpm-lock.yaml
index 9af1c0e7bffa..06cd580a351f 100644
--- a/pkg/ui/workspaces/db-console/pnpm-lock.yaml
+++ b/pkg/ui/workspaces/db-console/pnpm-lock.yaml
@@ -62,7 +62,7 @@ dependencies:
version: 5.1.15
'@typescript-eslint/utils':
specifier: ^5.26.0
- version: 5.26.0(eslint@7.29.0)(typescript@4.2.4)
+ version: 5.59.8(eslint@7.29.0)(typescript@4.2.4)
analytics-node:
specifier: ^3.5.0
version: 3.5.0
@@ -349,6 +349,9 @@ devDependencies:
copy-webpack-plugin:
specifier: ^4.5.1
version: 4.6.0
+ core-js:
+ specifier: ^2.6.12
+ version: 2.6.12
css-loader:
specifier: ^3.4.0
version: 3.6.0(webpack@4.46.0)
@@ -3107,6 +3110,16 @@ packages:
resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==}
dev: true
+ /@eslint-community/eslint-utils@4.4.0(eslint@7.29.0):
+ resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ dependencies:
+ eslint: 7.29.0
+ eslint-visitor-keys: 3.4.1
+ dev: false
+
/@eslint/eslintrc@0.4.2:
resolution: {integrity: sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -4907,6 +4920,10 @@ packages:
/@types/scheduler@0.16.1:
resolution: {integrity: sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==}
+ /@types/semver@7.5.0:
+ resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
+ dev: false
+
/@types/sinon@7.5.2:
resolution: {integrity: sha512-T+m89VdXj/eidZyejvmoP9jivXgBDdkOSBVQjU9kF349NEx10QdPNGxHeZUaj1IlJ32/ewdyXJjnJxyxJroYwg==}
dev: true
@@ -5054,12 +5071,12 @@ packages:
'@typescript-eslint/visitor-keys': 4.29.1
dev: true
- /@typescript-eslint/scope-manager@5.26.0:
- resolution: {integrity: sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==}
+ /@typescript-eslint/scope-manager@5.59.8:
+ resolution: {integrity: sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- '@typescript-eslint/types': 5.26.0
- '@typescript-eslint/visitor-keys': 5.26.0
+ '@typescript-eslint/types': 5.59.8
+ '@typescript-eslint/visitor-keys': 5.59.8
dev: false
/@typescript-eslint/types@4.29.1:
@@ -5067,8 +5084,8 @@ packages:
engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
dev: true
- /@typescript-eslint/types@5.26.0:
- resolution: {integrity: sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==}
+ /@typescript-eslint/types@5.59.8:
+ resolution: {integrity: sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: false
@@ -5093,8 +5110,8 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/typescript-estree@5.26.0(typescript@4.2.4):
- resolution: {integrity: sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==}
+ /@typescript-eslint/typescript-estree@5.59.8(typescript@4.2.4):
+ resolution: {integrity: sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
@@ -5102,8 +5119,8 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/types': 5.26.0
- '@typescript-eslint/visitor-keys': 5.26.0
+ '@typescript-eslint/types': 5.59.8
+ '@typescript-eslint/visitor-keys': 5.59.8
debug: 4.3.4(supports-color@6.1.0)
globby: 11.1.0
is-glob: 4.0.3
@@ -5114,19 +5131,21 @@ packages:
- supports-color
dev: false
- /@typescript-eslint/utils@5.26.0(eslint@7.29.0)(typescript@4.2.4):
- resolution: {integrity: sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==}
+ /@typescript-eslint/utils@5.59.8(eslint@7.29.0)(typescript@4.2.4):
+ resolution: {integrity: sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@7.29.0)
'@types/json-schema': 7.0.12
- '@typescript-eslint/scope-manager': 5.26.0
- '@typescript-eslint/types': 5.26.0
- '@typescript-eslint/typescript-estree': 5.26.0(typescript@4.2.4)
+ '@types/semver': 7.5.0
+ '@typescript-eslint/scope-manager': 5.59.8
+ '@typescript-eslint/types': 5.59.8
+ '@typescript-eslint/typescript-estree': 5.59.8(typescript@4.2.4)
eslint: 7.29.0
eslint-scope: 5.1.1
- eslint-utils: 3.0.0(eslint@7.29.0)
+ semver: 7.5.1
transitivePeerDependencies:
- supports-color
- typescript
@@ -5140,11 +5159,11 @@ packages:
eslint-visitor-keys: 2.1.0
dev: true
- /@typescript-eslint/visitor-keys@5.26.0:
- resolution: {integrity: sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==}
+ /@typescript-eslint/visitor-keys@5.59.8:
+ resolution: {integrity: sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
- '@typescript-eslint/types': 5.26.0
+ '@typescript-eslint/types': 5.59.8
eslint-visitor-keys: 3.4.1
dev: false
@@ -8699,6 +8718,7 @@ packages:
dependencies:
eslint: 7.29.0
eslint-visitor-keys: 2.1.0
+ dev: true
/eslint-visitor-keys@1.3.0:
resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
diff --git a/pkg/ui/workspaces/db-console/yarn.lock b/pkg/ui/workspaces/db-console/yarn.lock
index a1d0d77608fc..c88a76cd7fa7 100644
--- a/pkg/ui/workspaces/db-console/yarn.lock
+++ b/pkg/ui/workspaces/db-console/yarn.lock
@@ -7528,6 +7528,11 @@ core-js@^2.6.12:
resolved "https://storage.googleapis.com/cockroach-npm-deps/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+core-js@^3.0.1:
+ version "3.31.1"
+ resolved "https://storage.googleapis.com/cockroach-npm-deps/core-js/-/core-js-3.31.1.tgz#f2b0eea9be9da0def2c5fece71064a7e5d687653"
+ integrity sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==
+
core-js@^3.0.4:
version "2.6.12"
resolved "https://storage.googleapis.com/cockroach-npm-deps/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
@@ -17751,6 +17756,22 @@ react-router@5.2.0:
tiny-invariant "^1.0.2"
tiny-warning "^1.0.0"
+react-router@5.3.1:
+ version "5.3.1"
+ resolved "https://storage.googleapis.com/cockroach-npm-deps/react-router/-/react-router-5.3.1.tgz#b13e84a016c79b9e80dde123ca4112c4f117e3cf"
+ integrity sha512-v+zwjqb7bakqgF+wMVKlAPTca/cEmPOvQ9zt7gpSNyPXau1+0qvuYZ5BWzzNDP1y6s15zDwgb9rPN63+SIniRQ==
+ dependencies:
+ "@babel/runtime" "^7.12.13"
+ history "^4.9.0"
+ hoist-non-react-statics "^3.1.0"
+ loose-envify "^1.3.1"
+ mini-create-react-context "^0.4.0"
+ path-to-regexp "^1.7.0"
+ prop-types "^15.6.2"
+ react-is "^16.6.0"
+ tiny-invariant "^1.0.2"
+ tiny-warning "^1.0.0"
+
react-select@1.2.1:
version "1.2.1"
resolved "https://storage.googleapis.com/cockroach-npm-deps/react-select/-/react-select-1.2.1.tgz#a2fe58a569eb14dcaa6543816260b97e538120d1"