import { useParams } from 'common' import { ExternalLink, Loader2 } from 'lucide-react' import { parseAsBoolean, useQueryState } from 'nuqs' import { forwardRef } from 'react' import { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from 'ui' import Results from './Results' import { getSqlErrorLines } from './UtilityTabResults.utils' import { subscriptionHasHipaaAddon } from '@/components/interfaces/Billing/Subscription/Subscription.utils' import { AiAssistantDropdown } from '@/components/ui/AiAssistantDropdown' import CopyButton from '@/components/ui/CopyButton' import { InlineLink, InlineLinkClassName } from '@/components/ui/InlineLink' import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' import { useOrgSubscriptionQuery } from '@/data/subscriptions/org-subscription-query' import { useSelectedOrganizationQuery } from '@/hooks/misc/useSelectedOrganization' import { DOCS_URL } from '@/lib/constants' import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector' import { useSqlEditorV2StateSnapshot } from '@/state/sql-editor-v2' export type UtilityTabResultsProps = { id: string isExecuting?: boolean isDisabled?: boolean onDebug: () => void buildDebugPrompt: () => string isDebugging?: boolean } export const UtilityTabResults = forwardRef( ({ id, isExecuting, isDisabled, isDebugging, onDebug, buildDebugPrompt }) => { const { ref } = useParams() const state = useDatabaseSelectorStateSnapshot() const { data: organization } = useSelectedOrganizationQuery() const snapV2 = useSqlEditorV2StateSnapshot() const [, setShowConnect] = useQueryState('showConnect', parseAsBoolean.withDefault(false)) const result = snapV2.results[id]?.[0] const { data: subscription } = useOrgSubscriptionQuery({ orgSlug: organization?.slug }) // Customers on HIPAA plans should not have access to Briven AI const { data: projectSettings } = useProjectSettingsV2Query({ projectRef: ref }) const hasHipaaAddon = subscriptionHasHipaaAddon(subscription) && projectSettings?.is_sensitive const isTimeout = result?.error?.message?.includes('canceling statement due to statement timeout') || result?.error?.message?.includes('upstream request timeout') || result?.error?.message?.includes('Query read timeout') const isNetWorkError = result?.error?.message?.includes('EHOSTUNREACH') if (isExecuting) { return (

Running...

) } else if (result?.error) { const errorLines = getSqlErrorLines(result.error) const readReplicaError = state.selectedDatabaseId !== ref && result.error.message.includes('in a read-only transaction') const payloadTooLargeError = result.error.message.includes( 'Query is too large to be run via the SQL Editor' ) return (
{isTimeout ? (

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 .

) : (
{errorLines.length > 0 ? ( errorLines.map((x: string, i: number) => (
                      {x}
                    
)) ) : (

Error: {result.error?.message}

)} {!isTimeout && !isNetWorkError && result.autoLimit && (

Note: A limit of {result.autoLimit} was applied to your query. If this was the cause of a syntax error, try selecting "No limit" instead and re-run the query.

)} {readReplicaError && (

Note: Read replicas are for read only queries. Run write queries on the primary database instead.

)} {payloadTooLargeError && (

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

)}
)}
{readReplicaError && ( )} {errorLines.length > 0 && ( Copy error )} {!hasHipaaAddon && ( )}
) } else if (!result) { return (

Click Run to execute your query

) } else if (result.rows.length <= 0) { return (

Success. No rows returned

) } return } ) UtilityTabResults.displayName = 'UtilityTabResults'