From d85e6f896b870448fa5d81bc9cada3ea0e36cf09 Mon Sep 17 00:00:00 2001 From: Cameron Blackwood <38852603+Reikon95@users.noreply.github.com> Date: Thu, 11 Jun 2026 11:49:16 +0100 Subject: [PATCH 01/13] docs: update realtime limits to include prescence calls (#46841) --- apps/docs/content/guides/realtime/limits.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/docs/content/guides/realtime/limits.mdx b/apps/docs/content/guides/realtime/limits.mdx index edea5d6dc2d1b..5c45b111e4d7c 100644 --- a/apps/docs/content/guides/realtime/limits.mdx +++ b/apps/docs/content/guides/realtime/limits.mdx @@ -23,6 +23,7 @@ Upgrade your plan to increase your limits. Without a spend cap, or on an Enterpr | **Channels per connection** | 100 | 100 | 100 | 100 | 100+ | | **Presence keys per object** | 10 | 10 | 10 | 10 | 10+ | | **Presence messages per second** | 20 | 50 | 1,000 | 1,000 | 1,000+ | +| **Presence calls per client, per 30 seconds** | 5 | 5 | 5 | 5 | 5 | | **Broadcast payload size** | 256 KB | 3,000 KB | 3,000 KB | 3,000 KB | 3,000+ KB | | **Postgres change payload size ([**read more**](#postgres-changes-payload-limit))** | 1,024 KB | 1,024 KB | 1,024 KB | 1,024 KB | 1,024+ KB | From 324c72411766d6d037e3ed99cb7fc1726be6d9d0 Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Thu, 11 Jun 2026 12:58:36 +0200 Subject: [PATCH 02/13] ref(replication): Improve replication copy and UI (#46793) This PR improves the replication UI in the following ways: - Adds a new selecion picker for destinations which is split by the destination location and it's clearer and can scale more when we add more destinations. - Adds a much improved section on lag, highlighting new metrics that could help debug issues more easily. - Improves the copy across the whole code. - Fixes the 2d topological view of replication with better status handling. ### Screenshots image image image image ## Summary by CodeRabbit * **New Features** * Live slot health indicators, legend, and connection badges. * Grouped destination type dropdown with alpha badges. * **Improvements** * Clearer UI copy for external destinations, alpha disclaimers, and onboarding flows. * Consolidated "n/a" handling for lag displays and richer metric tooltips. * Simplified replication diagram visuals and clearer table/row status/lag presentation. * Replication status responses now include expanded slot health and lag metrics. * **Tests** * New test suites covering destination selection and destination row states. --- .../Replication/DeleteDestination.tsx | 2 +- .../DestinationForm/AdvancedSettings.tsx | 8 +- .../NoDestinationsAvailable.tsx | 2 +- .../DestinationForm/PublicationSelection.tsx | 2 +- .../ReplicationDisclaimerDialog.tsx | 8 +- .../DestinationPanel/DestinationPanel.tsx | 10 +- .../DestinationTypeSelection.test.tsx | 160 ++++++++++ .../DestinationTypeSelection.tsx | 259 ++++++++-------- .../ReadReplicaEligibilityWarnings.tsx | 8 +- .../Replication/DestinationRow.test.tsx | 280 ++++++++++++++++++ .../Database/Replication/DestinationRow.tsx | 34 ++- .../Database/Replication/Destinations.tsx | 8 +- .../Replication/EnableReplicationCallout.tsx | 10 +- .../ReadReplicas/ReadReplicaDetails.tsx | 4 +- .../Replication/ReplicationDiagram/Edges.tsx | 222 +++++++++----- .../Replication/ReplicationDiagram/Nodes.tsx | 36 ++- .../Replication/ReplicationDiagram/index.tsx | 89 ++---- .../ReplicationPipelineStatus.tsx | 16 +- .../ReplicationPipelineStatus.types.ts | 18 +- .../ReplicationPipelineStatus.utils.tsx | 165 +++++++++-- .../SlotLagMetrics.tsx | 141 ++++++--- .../ReplicationPipelineStatus/SlotStatus.tsx | 135 +++++++++ .../Database/Replication/RowMenu.tsx | 18 +- packages/api-types/types/platform.d.ts | 40 ++- 24 files changed, 1268 insertions(+), 407 deletions(-) create mode 100644 apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationTypeSelection.test.tsx create mode 100644 apps/studio/components/interfaces/Database/Replication/DestinationRow.test.tsx create mode 100644 apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotStatus.tsx diff --git a/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx b/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx index 2489f40535598..0fddb5a6b1890 100644 --- a/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DeleteDestination.tsx @@ -24,7 +24,7 @@ export const DeleteDestination = ({ confirmLabel={isLoading ? 'Deleting...' : `Delete destination`} confirmPlaceholder="Type in name of destination" confirmString={name ?? 'Unknown'} - text={`This will delete the destination "${name}"`} + text={`This will delete the destination "${name}".`} alert={{ title: 'You cannot recover this destination once deleted.' }} onCancel={() => setVisible(!visible)} onConfirm={onDelete} diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx index 3f909475df8bd..cba27702b7abc 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AdvancedSettings.tsx @@ -43,7 +43,7 @@ export const AdvancedSettings = ({
Advanced settings - Optional performance tuning + Optional settings to control the pipeline in more depth
@@ -165,7 +165,7 @@ export const AdvancedSettings = ({ - {destinationType !== 'Read Replica' && ( -

- External replication is in alpha. Expect rapid changes and possible breaking updates.{' '} + {selectedOption?.isAlpha && ( +

+ This destination type is in alpha and may change while we iterate.{' '} Leave feedback diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx index ed01b16a504c1..370d235c8a84a 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/ReadReplicaForm/ReadReplicaEligibilityWarnings.tsx @@ -65,7 +65,7 @@ export const ReadReplicaEligibilityWarnings = () => { if (hasOverdueInvoices) { return ( -

Please resolve all outstanding invoices first before deploying a new read replica

+

Please resolve all outstanding invoices first before deploying a new read replica.

@@ -81,7 +81,7 @@ export const ReadReplicaEligibilityWarnings = () => { >

Projects provisioned by other cloud providers currently will not be able to use read - replicas + replicas.

{ ) } @@ -108,7 +108,7 @@ export const ReadReplicaEligibilityWarnings = () => { type="warning" title="Read replicas can only be deployed with projects on Postgres version 15 and above" > -

If you'd like to use read replicas, please contact us via support

+

If you'd like to use read replicas, please contact us via support.

+ + + {field.description} + + + )} + + +
+ {valueTooltip ? ( - + {display} - - {description} + + {valueTooltip} - )} - - - {(() => { - const { display, detail } = getFormattedLagValue(type, metrics[key]) - return ( -
+ ) : ( {display} - {detail && {detail}} -
- ) - })()} - - ))} + )} + {detail && {detail}} + + + ) + })} ) } diff --git a/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotStatus.tsx b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotStatus.tsx new file mode 100644 index 0000000000000..e1d8f0c24d7fe --- /dev/null +++ b/apps/studio/components/interfaces/Database/Replication/ReplicationPipelineStatus/SlotStatus.tsx @@ -0,0 +1,135 @@ +import { Info } from 'lucide-react' +import { + Badge, + cn, + Popover, + PopoverContent, + PopoverTrigger, + Tooltip, + TooltipContent, + TooltipTrigger, +} from 'ui' + +import { SlotWalStatus } from './ReplicationPipelineStatus.types' +import { getWalStatusMeta, WAL_STATUS_LEGEND } from './ReplicationPipelineStatus.utils' +import { InlineLink } from '@/components/ui/InlineLink' +import { DOCS_URL } from '@/lib/constants' + +export type SlotStatusContext = 'pipeline' | 'table' + +const CONNECTION_TEXT: Record = { + pipeline: { + active: "This pipeline's replication slot is active and being used right now.", + inactive: "This pipeline's replication slot is not active right now.", + }, + table: { + active: "This table's replication slot is active and being used right now.", + inactive: "This table's replication slot is not active right now.", + }, +} + +/** + * Colored badge for a slot's WAL status, with the plain-language meaning on hover. + * Pass `context="table"` in the per-table inline view to show table-specific descriptions. + */ +export const SlotStatusBadge = ({ + status, + context = 'pipeline', +}: { + status?: SlotWalStatus + context?: SlotStatusContext +}) => { + const meta = getWalStatusMeta(status) + const description = context === 'table' ? meta.tableDescription : meta.description + return ( + + + + {meta.label} + + + + {description} + + + ) +} + +/** + * Info button opening a legend that explains every possible slot status. + */ +export const SlotStatusLegend = () => { + return ( + + + + + +
+

Slot statuses

+

+ How safely your database is keeping the changes the pipeline still needs. +

+
+
    + {WAL_STATUS_LEGEND.map((meta) => ( +
  • +
    + {meta.label} +
    + + {meta.description} + +
  • + ))} +
+
+ + Learn more about monitoring replication + +
+
+
+ ) +} + +/** + * Small dot + label indicating whether the slot has a live replication connection. + * Pass `context="table"` in the per-table inline view to show table-specific descriptions. + */ +export const SlotConnectionIndicator = ({ + isActive, + context = 'pipeline', +}: { + isActive?: boolean + context?: SlotStatusContext +}) => { + const text = CONNECTION_TEXT[context] + return ( + + + + + {isActive ? 'Connected' : 'Not connected'} + + + + {isActive ? text.active : text.inactive} + + + ) +} diff --git a/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx b/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx index 6360b277b7935..984ea9051a8f6 100644 --- a/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx +++ b/apps/studio/components/interfaces/Database/Replication/RowMenu.tsx @@ -9,6 +9,10 @@ import { DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, + Tooltip, + TooltipContent, + TooltipTrigger, + WarningIcon, } from 'ui' import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' @@ -18,7 +22,6 @@ import { PIPELINE_ENABLE_ALLOWED_FROM, } from './Pipeline.utils' import { PipelineStatusName } from './Replication.constants' -import AlertError from '@/components/ui/AlertError' import { ReplicationPipelineStatusData } from '@/data/replication/pipeline-status-query' import { Pipeline } from '@/data/replication/pipelines-query' import { useRestartPipelineHelper } from '@/data/replication/restart-pipeline-helper' @@ -134,7 +137,18 @@ export const RowMenu = ({
{isLoading && } - {isError && } + {isError && ( + + + + + + + + Couldn't load status{error?.message ? `: ${error.message}` : '.'} + + + )} diff --git a/packages/api-types/types/platform.d.ts b/packages/api-types/types/platform.d.ts index 42d08904d7d47..3524c4a70956f 100644 --- a/packages/api-types/types/platform.d.ts +++ b/packages/api-types/types/platform.d.ts @@ -9850,6 +9850,11 @@ export interface components { ReplicationPipelineReplicationStatusResponse: { /** @description Stats about apply worker lag */ apply_lag?: { + /** + * @description Whether the slot currently has an active replication connection. + * @example true + */ + active: boolean /** * @description Bytes between the current WAL location and the confirmed flush LSN. * @example 2048 @@ -9860,16 +9865,27 @@ export interface components { * @example 1200 */ flush_lag?: number + /** + * @description Milliseconds elapsed since the walsender last received client feedback. This can be present even when write and flush lag are unavailable. + * @example 5000 + */ + reply_time_lag?: number /** * @description Bytes between the current WAL location and the slot restart LSN. * @example 1024 */ restart_lsn_bytes: number /** - * @description How many bytes of WAL are still safe to build up before the limit of the slot is reached. + * @description How many bytes of WAL are still safe to build up before the limit of the slot is reached. `null` means Postgres reports unlimited slot WAL retention. * @example 8192 */ - safe_wal_size_bytes: number + safe_wal_size_bytes: number | null + /** + * @description WAL availability status reported by Postgres for the slot. + * @example reserved + * @enum {string} + */ + wal_status?: 'reserved' | 'extended' | 'unreserved' | 'lost' | 'unknown' /** * @description Write lag expressed in milliseconds. * @example 1500 @@ -9937,6 +9953,11 @@ export interface components { table_name: string /** @description Stats about table sync worker lag */ table_sync_lag?: { + /** + * @description Whether the slot currently has an active replication connection. + * @example true + */ + active: boolean /** * @description Bytes between the current WAL location and the confirmed flush LSN. * @example 2048 @@ -9947,16 +9968,27 @@ export interface components { * @example 1200 */ flush_lag?: number + /** + * @description Milliseconds elapsed since the walsender last received client feedback. This can be present even when write and flush lag are unavailable. + * @example 5000 + */ + reply_time_lag?: number /** * @description Bytes between the current WAL location and the slot restart LSN. * @example 1024 */ restart_lsn_bytes: number /** - * @description How many bytes of WAL are still safe to build up before the limit of the slot is reached. + * @description How many bytes of WAL are still safe to build up before the limit of the slot is reached. `null` means Postgres reports unlimited slot WAL retention. * @example 8192 */ - safe_wal_size_bytes: number + safe_wal_size_bytes: number | null + /** + * @description WAL availability status reported by Postgres for the slot. + * @example reserved + * @enum {string} + */ + wal_status?: 'reserved' | 'extended' | 'unreserved' | 'lost' | 'unknown' /** * @description Write lag expressed in milliseconds. * @example 1500 From 1a863a3fdf968b4dc8b7a2c5e923f72734967a84 Mon Sep 17 00:00:00 2001 From: Chris Chinchilla Date: Thu, 11 Jun 2026 13:04:18 +0200 Subject: [PATCH 03/13] docs: Use better links in Getting started overview (#46843) ## I have read the [CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md) file. YES ## Summary by CodeRabbit * **Documentation** * Updated navigation links in the getting started guide to direct users to the correct documentation pages. --- apps/docs/content/guides/getting-started.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/docs/content/guides/getting-started.mdx b/apps/docs/content/guides/getting-started.mdx index 7559d93015f22..45a0a7892cc69 100644 --- a/apps/docs/content/guides/getting-started.mdx +++ b/apps/docs/content/guides/getting-started.mdx @@ -10,7 +10,7 @@ hideToc: true
- + - + Use the Supabase CLI to develop locally and collaborate between teams. From f36adc18b0268507d66d2fe22d625d2941540ff6 Mon Sep 17 00:00:00 2001 From: "supabase-supabase-autofixer[bot]" <248690971+supabase-supabase-autofixer[bot]@users.noreply.github.com> Date: Thu, 11 Jun 2026 11:09:19 +0000 Subject: [PATCH 04/13] [bot] Sync from supabase/troubleshooting (#46842) This PR syncs the latest troubleshooting guides from the supabase/troubleshooting repository. --------- Co-authored-by: github-docs-bot Co-authored-by: Chris Chinchilla Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- ...st-error-during-storage-uploads-8f21f0.mdx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 apps/docs/content/troubleshooting/relation-objects-does-not-exist-error-during-storage-uploads-8f21f0.mdx diff --git a/apps/docs/content/troubleshooting/relation-objects-does-not-exist-error-during-storage-uploads-8f21f0.mdx b/apps/docs/content/troubleshooting/relation-objects-does-not-exist-error-during-storage-uploads-8f21f0.mdx new file mode 100644 index 0000000000000..69de7d3fbb2e5 --- /dev/null +++ b/apps/docs/content/troubleshooting/relation-objects-does-not-exist-error-during-storage-uploads-8f21f0.mdx @@ -0,0 +1,30 @@ +--- +title = "Postgres error 'relation objects does not exist' during Storage uploads" +date_created = "2026-06-10T15:05:10+00:00" +topics = [ "auth", "database", "storage" ] +keywords = [] +[[errors]] +code = "42P01" +message = "relation 'objects' does not exist" + +[[errors]] +http_status_code = 500 +message = "Internal Server Error" +--- + +If authenticated users receive a `500 Internal Server Error` during file uploads and your database logs report `error: relation "objects" does not exist`, it typically indicates the database cannot locate the required internal storage tables. + +**Why Does This Happen?** +This error occurs when the `authenticated` role's `search_path` does not include the `storage` schema. Because the schema is missing from the path, the database fails to find the `objects` table (which resides in `storage.objects`) during the upload process. + +**How to Fix:** +You can resolve this by updating the role configuration via the [SQL Editor](/dashboard/project/_/sql/new): + +1. Execute the following command to append the storage schema to the role's search path: + `ALTER ROLE authenticated SET search_path = public, storage;` +2. Verify that uploads from authenticated users now succeed. + +**Best Practices:** + +- To maintain compatibility with default schema permissions, avoid creating custom Postgres roles for application users. +- Instead, use custom claims within `auth.users.raw_app_meta_data` to manage user-specific logic or permissions. From 8300e6a14abeba03a4a290ca64239d1f56eab118 Mon Sep 17 00:00:00 2001 From: Vaibhav <117663341+7ttp@users.noreply.github.com> Date: Thu, 11 Jun 2026 18:36:28 +0530 Subject: [PATCH 05/13] fix: jsonb warning (#46828) - closes https://github.com/supabase/supabase/issues/46818 ## Summary by CodeRabbit * **Bug Fixes** * Improved truncation detection in the table row editor to consider column data formats, yielding more accurate handling of JSON and array field values and avoiding incorrect truncation/skipped updates. * **Tests** * Updated and added tests to validate format-aware truncation behavior, including multidimensional array cases. --- .../SidePanelEditor/RowEditor/InputField.tsx | 6 +++--- .../SidePanelEditor/RowEditor/JsonEditor/index.tsx | 5 ++++- .../RowEditor/RowEditor.utils.test.ts | 12 +++++++++--- .../SidePanelEditor/RowEditor/RowEditor.utils.ts | 12 ++++++------ 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/InputField.tsx b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/InputField.tsx index 1843f4937df6c..39467a3ea3cfb 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/InputField.tsx +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/InputField.tsx @@ -173,7 +173,7 @@ export const InputField = ({ } if (includes(TEXT_TYPES, field.format)) { - const isTruncated = isValueTruncated(field.value) + const isTruncated = isValueTruncated(field.value, field.format) /** * Handle `undefined` as the default value of the input field @@ -250,7 +250,7 @@ export const InputField = ({ } if (includes(JSON_TYPES, field.format)) { - const isTruncated = isValueTruncated(field.value) + const isTruncated = isValueTruncated(field.value, field.format) return ( candidate.name === column + )?.format + const isTruncated = isValueTruncated(jsonString, columnFormat) const { mutate: getCellValue, isPending, isSuccess, reset } = useGetCellValueMutation() diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts index d6e7bdd4a9ad6..da3ab85c0c839 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.test.ts @@ -274,12 +274,12 @@ describe('isValueTruncated', () => { // Pattern 4: Multi-dimensional array (lines 211-212) // column[1:50]::type[] - no special marker, just detect by [[ pattern - expect(isValueTruncated('[["item"]]')).toBe(true) - expect(isValueTruncated('[["item1","item2"]]')).toBe(true) + expect(isValueTruncated('[["item"]]', '_text')).toBe(true) + expect(isValueTruncated('[["item1","item2"]]', '_text')).toBe(true) }) it('should detect multidimensional arrays', () => { - expect(isValueTruncated('[["item1", "item2"]]')).toBe(true) + expect(isValueTruncated('[["item1", "item2"]]', '_text')).toBe(true) }) it('should detect truncated JSON arrays with truncated flag', () => { @@ -303,6 +303,12 @@ describe('isValueTruncated', () => { expect(isValueTruncated({} as any)).toBe(false) }) + it('should not flag small jsonb arrays as truncated', () => { + expect( + isValueTruncated('[["infrequently","frequently","constantly"],["90","30","180"]]', 'jsonb') + ).toBe(false) + }) + it('should test edge cases that could break coordination with table-row-query.ts', () => { // Test values that are just under/at the thresholds to ensure boundaries are correct diff --git a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts index 0d9da5a66acbc..1837ede1343b9 100644 --- a/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts +++ b/apps/studio/components/interfaces/TableGridEditor/SidePanelEditor/RowEditor/RowEditor.utils.ts @@ -97,7 +97,7 @@ export const validateFields = (fields: RowField[]) => { } } if (field.format.includes('json') && (field.value?.length ?? 0) > 0) { - const isTruncated = isValueTruncated(field.value) + const isTruncated = isValueTruncated(field.value, field.format) // don't validate if the value is truncated if (isTruncated) return @@ -244,7 +244,7 @@ export const generateUpdateRowPayload = (originalRow: any, fields: RowField[]) = } else if (type !== undefined && JSON_TYPES.includes(type)) { // don't update if the value is truncated. This is to enable the user to change cell values on rows which have // truncated JSON values. If the user - const isTruncated = isValueTruncated(field?.value) + const isTruncated = isValueTruncated(field?.value, field?.format) if (!isTruncated) { payload[property] = rowObject[property] } @@ -263,7 +263,9 @@ export const generateUpdateRowPayload = (originalRow: any, fields: RowField[]) = /** * Checks if the value is truncated. The JSON types are usually truncated if they're too big to show in the editor. */ -export const isValueTruncated = (value: string | null | undefined) => { +export const isValueTruncated = (value: string | null | undefined, format?: string | null) => { + const isArrayColumn = typeof format === 'string' && format.startsWith('_') + return ( (typeof value === 'string' && value.endsWith('...') && value.length > MAX_CHARACTERS) || // if the value is an array which total representation is > MAX_CHARACTERS @@ -275,9 +277,7 @@ export const isValueTruncated = (value: string | null | undefined) => { // If the array have MAX_ARRAY_SIZE elements in it // its a large truncated array (value.match(/","/g) || []).length === MAX_ARRAY_SIZE) || - // if the string represent a multi-dimentional array we always consider it as possibly truncated - // so user load the whole value before edition - (typeof value === 'string' && value.startsWith('[["')) || + (typeof value === 'string' && isArrayColumn && value.startsWith('[["')) || // [Joshen] For json arrays, refer to getTableRowsSql from table-row-query // for array types, we're adding {"truncated": true} as the last item of the JSON to // maintain the JSON array structure From f402b4d464a4c40d4073b568dc92d9fb0ba22d0e Mon Sep 17 00:00:00 2001 From: Francesco Sansalvadore Date: Thu, 11 Jun 2026 15:07:49 +0200 Subject: [PATCH 06/13] feat(studio): og image (#46839) Add proper og image to studio app. --- apps/studio/pages/_app.tsx | 2 +- apps/studio/public/img/supabase-og.png | Bin 0 -> 8593 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 apps/studio/public/img/supabase-og.png diff --git a/apps/studio/pages/_app.tsx b/apps/studio/pages/_app.tsx index 33d4d6b42fe34..f55fde22c31ad 100644 --- a/apps/studio/pages/_app.tsx +++ b/apps/studio/pages/_app.tsx @@ -186,7 +186,7 @@ function CustomApp({ Component, pageProps }: AppPropsWithLayout) { {appTitle ?? 'Supabase'} - + {/* [Alaister]: This has to be an inline style tag here and not a separate component due to next/font */}