diff --git a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx index 819ac06bc4d..6d27322ec5f 100644 --- a/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx +++ b/apps/studio/components/interfaces/SQLEditor/UtilityPanel/UtilityTabResults.tsx @@ -1,15 +1,16 @@ import { ExternalLink, Loader2 } from 'lucide-react' -import Link from 'next/link' +import { parseAsBoolean, useQueryState } from 'nuqs' import { forwardRef } from 'react' import { useParams } from 'common' import { subscriptionHasHipaaAddon } from 'components/interfaces/Billing/Subscription/Subscription.utils' import CopyButton from 'components/ui/CopyButton' +import { InlineLink, InlineLinkClassName } from 'components/ui/InlineLink' import { useOrgSubscriptionQuery } from 'data/subscriptions/org-subscription-query' import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization' import { useDatabaseSelectorStateSnapshot } from 'state/database-selector' import { useSqlEditorV2StateSnapshot } from 'state/sql-editor-v2' -import { AiIconAnimation, Button, Tooltip, TooltipContent, TooltipTrigger } from 'ui' +import { AiIconAnimation, Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import Results from './Results' export type UtilityTabResultsProps = { @@ -21,11 +22,12 @@ export type UtilityTabResultsProps = { } const UtilityTabResults = forwardRef( - ({ id, isExecuting, isDisabled, isDebugging, onDebug }, htmlRef) => { + ({ id, isExecuting, isDisabled, isDebugging, onDebug }) => { const { ref } = useParams() const state = useDatabaseSelectorStateSnapshot() const organization = useSelectedOrganization() const snapV2 = useSqlEditorV2StateSnapshot() + const [, setShowConnect] = useQueryState('showConnect', parseAsBoolean.withDefault(false)) const result = snapV2.results[id]?.[0] const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: organization?.slug }) @@ -35,7 +37,9 @@ const UtilityTabResults = forwardRef( const isTimeout = result?.error?.message?.includes('canceling statement due to statement timeout') || - result?.error?.message?.includes('upstream request timeout') + result?.error?.message?.includes('upstream request timeout') || + result?.error?.message?.includes('Query read timeout') + const isNetWorkError = result?.error?.message?.includes('EHOSTUNREACH') if (isExecuting) { @@ -61,26 +65,25 @@ const UtilityTabResults = forwardRef(
{isTimeout ? (
-

SQL query ran into an upstream timeout

-

+

+ Error: SQL query ran into an upstream timeout +

+

You can either{' '} - + optimize your query - + , or{' '} - + increase the statement timeout - + + {' or '} + setShowConnect(true)} + > + connect to your database directly + .

@@ -110,15 +113,13 @@ const UtilityTabResults = forwardRef( {payloadTooLargeError && (

Run this query by{' '} - setShowConnect(true)} + className={cn(InlineLinkClassName, 'flex items-center gap-x-1')} > connecting to your database directly - + .

)} diff --git a/apps/studio/components/ui/InlineLink.tsx b/apps/studio/components/ui/InlineLink.tsx index 208da43c3f8..55494977bf6 100644 --- a/apps/studio/components/ui/InlineLink.tsx +++ b/apps/studio/components/ui/InlineLink.tsx @@ -9,16 +9,16 @@ interface InlineLinkProps { rel?: string } +export const InlineLinkClassName = + 'underline transition underline-offset-2 decoration-foreground-lighter hover:decoration-foreground text-foreground' + export const InlineLink = ({ href, className: _className, children, ...props }: PropsWithChildren) => { - const className = cn( - 'underline transition underline-offset-2 decoration-foreground-lighter hover:decoration-foreground text-foreground', - _className - ) + const className = cn(InlineLinkClassName, _className) if (href.startsWith('http')) { return (