@graphenedata/cli 0.0.17 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/{bigQuery-OQUNH3VT.js → bigQuery-YIWXZPY6.js} +2 -2
  3. package/dist/cli/{chunk-56K2FF57.js → chunk-SQVXTHE5.js} +2 -2
  4. package/dist/cli/{chunk-56K2FF57.js.map → chunk-SQVXTHE5.js.map} +2 -2
  5. package/dist/cli/{chunk-TZTTALAV.js → chunk-UTV3ERGI.js} +248 -138
  6. package/dist/cli/chunk-UTV3ERGI.js.map +7 -0
  7. package/dist/cli/cli.js +3 -3
  8. package/dist/cli/{duckdb-TKVMONRK.js → duckdb-V6PJEA7H.js} +2 -2
  9. package/dist/cli/{serve2-S2LL4D4D.js → serve2-CGQSM7TD.js} +3 -3
  10. package/dist/cli/{snowflake-3VPDEYYP.js → snowflake-HVSTYBLB.js} +2 -2
  11. package/dist/index.d.ts +4 -4
  12. package/dist/lang/index.d.ts +4 -4
  13. package/dist/skills/graphene/SKILL.md +3 -3
  14. package/dist/skills/graphene/references/gsql.md +26 -23
  15. package/dist/ui/component-utilities/enrich.ts +72 -37
  16. package/dist/ui/component-utilities/format.ts +36 -21
  17. package/dist/ui/component-utilities/theme.ts +0 -1
  18. package/dist/ui/components/AreaChart.svelte +1 -1
  19. package/dist/ui/components/BarChart.svelte +1 -1
  20. package/dist/ui/components/LineChart.svelte +1 -1
  21. package/dist/ui/internal/PageNavGroup.svelte +2 -2
  22. package/dist/ui/internal/Sidebar.svelte +7 -7
  23. package/dist/ui/internal/sidebar.svelte.js +11 -1
  24. package/package.json +1 -1
  25. package/dist/cli/chunk-TZTTALAV.js.map +0 -7
  26. /package/dist/cli/{bigQuery-OQUNH3VT.js.map → bigQuery-YIWXZPY6.js.map} +0 -0
  27. /package/dist/cli/{duckdb-TKVMONRK.js.map → duckdb-V6PJEA7H.js.map} +0 -0
  28. /package/dist/cli/{serve2-S2LL4D4D.js.map → serve2-CGQSM7TD.js.map} +0 -0
  29. /package/dist/cli/{snowflake-3VPDEYYP.js.map → snowflake-HVSTYBLB.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../lang/types.ts", "../../../lang/fanout.ts", "../../../lang/temporalMetadata.ts", "../../../lang/util.ts", "../../../lang/bigQueryFunctions.ts", "../../../lang/clickHouseFunctions.ts", "../../../lang/duckDbFunctions.ts", "../../../lang/snowflakeFunctions.ts", "../../../lang/functions.ts", "../../../lang/chartProps.ts", "../../../lang/parser.js", "../../../lang/parser.terms.js", "../../../lang/tokens.js", "../../../lang/sveltish.ts", "../../../lang/markdown.ts", "../../../lang/metadata.ts", "../../../lang/temporal.ts", "../../../lang/analyze.ts", "../../../lang/core.ts", "../../../lang/params.ts", "../../auth.ts", "../../background.ts", "../../mockFiles.ts", "../../printer.ts", "../../telemetry/index.ts", "../../telemetry/storage.ts", "../../connections/index.ts", "../../run.ts", "../../normalizeFile.ts"],
4
+ "sourcesContent": ["import type {SyntaxNode, Tree} from '@lezer/common'\n\nimport type {ExprFanout, FanoutPath} from './fanout.ts'\nimport type {ArrayField, FieldMeta, FieldType, GrapheneError, Position, ScalarField, TimeGrain, TimeOrdinal} from './index.d.ts'\nimport type {TimestampUnit} from './temporal.ts'\n\ndeclare module '@lezer/common' {\n interface Tree {\n fileInfo?: FileInfo\n }\n}\n\nexport interface AnalysisWorkspace {\n config: AnalysisConfig\n files: WorkspaceFileInput[]\n}\n\nexport interface AnalysisResult {\n files: FileInfo[]\n diagnostics: GrapheneError[]\n}\n\nexport interface AnalysisConfig {\n dialect: string\n defaultNamespace?: string\n}\n\nexport interface WorkspaceFileInput {\n path: string\n contents: string\n kind?: FileKind\n parsed?: ParsedFileArtifacts\n}\n\nexport type FileKind = 'gsql' | 'md'\n\nexport interface ParsedFileArtifacts {\n tree: Tree\n virtualContents?: string\n virtualToMarkdownOffset?: number[]\n diagnostics?: ParsedFileDiagnostic[]\n}\n\nexport interface ParsedFileDiagnostic {\n message: string\n from: number\n to: number\n}\n\nexport type {FieldType, FieldMeta, GrapheneError, Position, ScalarField, ArrayField, TimeGrain, TimeOrdinal}\nexport type TypeKind = ScalarField | 'array'\n\nlet SCALAR_TYPE_ALIASES: Record<string, ScalarField> = {\n int: 'number',\n int64: 'number',\n number: 'number',\n integer: 'number',\n numeric: 'number',\n float: 'number',\n decimal: 'number',\n float32: 'number',\n float64: 'number',\n double: 'number',\n bigint: 'number',\n uint8: 'number',\n uint16: 'number',\n uint32: 'number',\n uint64: 'number',\n smallint: 'number',\n tinyint: 'number',\n byteint: 'number',\n bigdecimal: 'number',\n variant: 'string',\n object: 'json',\n text: 'string',\n string: 'string',\n varchar: 'string',\n char: 'string',\n fixedstring: 'string',\n geography: 'string',\n bool: 'boolean',\n boolean: 'boolean',\n date: 'date',\n datetime: 'timestamp',\n time: 'timestamp',\n timestamp: 'timestamp',\n datetime64: 'timestamp',\n timestamp_ntz: 'timestamp',\n timestamp_tz: 'timestamp',\n timestamp_ltz: 'timestamp',\n json: 'json',\n interval: 'interval',\n}\n\nexport function scalarType<K extends ScalarField>(kind: K): K {\n return kind\n}\n\nexport function arrayOf(elementType: FieldType): ArrayField {\n return {type: 'array', elementType}\n}\n\nexport function isArrayType(type: FieldType | null | undefined): type is ArrayField {\n return !!type && typeof type == 'object' && type.type == 'array'\n}\n\nexport function isScalarType<K extends ScalarField>(type: FieldType | null | undefined, kind?: K): type is K {\n if (!type || typeof type != 'string') return false\n return kind ? type == kind : true\n}\n\nexport function isSameType(left: FieldType | null | undefined, right: FieldType | null | undefined): boolean {\n if (!left || !right) return false\n if (isArrayType(left) || isArrayType(right)) {\n if (!isArrayType(left) || !isArrayType(right)) return false\n return isSameType(left.elementType, right.elementType)\n }\n return left == right\n}\n\nexport function formatType(type: FieldType | null | undefined): string {\n if (!type) return 'unknown'\n if (isArrayType(type)) {\n if (isScalarType(type.elementType, 'sql native')) return 'array'\n return `array<${formatType(type.elementType)}>`\n }\n return type\n}\n\nexport function normalizeScalarType(rawType: string): ScalarField | null {\n let kind = SCALAR_TYPE_ALIASES[normalizeTypeName(rawType)]\n return kind ? scalarType(kind) : null\n}\n\nexport function parseGsqlFieldType(rawType: string): {type: FieldType | null; error?: string} {\n return parseFieldType(rawType, {allowArrayKeyword: true, allowBracketArray: false, allowNamedArray: false})\n}\n\nexport function parseWarehouseFieldType(rawType: string): {type: FieldType | null; error?: string; displayType?: string} {\n let parsed = parseFieldType(rawType, {allowArrayKeyword: true, allowBracketArray: true, allowNamedArray: true})\n let displayType = parsed.type && shouldNormalizeWarehouseType(rawType) ? formatType(parsed.type) : rawType\n return {...parsed, displayType}\n}\n\nfunction parseFieldType(rawType: string, opts: {allowArrayKeyword: boolean; allowBracketArray: boolean; allowNamedArray: boolean}): {type: FieldType | null; error?: string} {\n let value = unwrapWarehouseType(rawType.trim())\n if (!value) return {type: null}\n\n if (/^enum(?:8|16)\\s*\\(/i.test(value)) return {type: scalarType('string')}\n\n if (opts.allowBracketArray && value.endsWith('[]')) {\n let inner = parseFieldType(value.slice(0, -2), opts)\n if (!inner.type) return inner\n if (isArrayType(inner.type)) return {type: null, error: 'Nested arrays are not supported'}\n return {type: arrayOf(inner.type)}\n }\n\n let match = value.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*<(.+)>$/s)\n if (match) {\n let typeName = normalizeTypeName(match[1])\n if (typeName == 'array' && opts.allowArrayKeyword) return parseArrayType(match[2], opts)\n if ((typeName == 'list' || typeName == 'array') && opts.allowNamedArray) return parseArrayType(match[2], opts)\n }\n\n let callMatch = value.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*\\((.+)\\)$/s)\n if (callMatch) {\n let typeName = normalizeTypeName(callMatch[1])\n if ((typeName == 'list' || typeName == 'array') && opts.allowNamedArray) return parseArrayType(callMatch[2], opts)\n }\n\n let normalizedScalarType = normalizeScalarType(value)\n return {type: normalizedScalarType}\n}\n\nfunction parseArrayType(innerType: string, opts: {allowArrayKeyword: boolean; allowBracketArray: boolean; allowNamedArray: boolean}): {type: FieldType | null; error?: string} {\n let parsed = parseFieldType(innerType, opts)\n if (!parsed.type) return parsed\n if (isArrayType(parsed.type)) return {type: null, error: 'Nested arrays are not supported'}\n return {type: arrayOf(parsed.type)}\n}\n\nfunction normalizeTypeName(rawType: string): string {\n return rawType.trim().replace(/\\s+/g, '_').toLowerCase()\n}\n\nfunction unwrapWarehouseType(rawType: string): string {\n let value = rawType.trim()\n while (true) {\n let wrapped = unwrapTypeCall(value, 'nullable') || unwrapTypeCall(value, 'lowcardinality')\n if (!wrapped) return value\n value = wrapped\n }\n}\n\nfunction shouldNormalizeWarehouseType(rawType: string) {\n // Schema output usually preserves the warehouse's native type spelling, but these\n // wrappers/syntax variants are mostly implementation detail and read better once\n // normalized to Graphene's shared type vocabulary.\n return /\\[\\]$/.test(rawType) || /^array\\s*[<(]/i.test(rawType) || /^nullable\\s*\\(/i.test(rawType) || /^lowcardinality\\s*\\(/i.test(rawType) || /^enum(?:8|16)\\s*\\(/i.test(rawType)\n}\n\nfunction unwrapTypeCall(value: string, fn: string): string | null {\n if (!value.toLowerCase().startsWith(fn + '(') || !value.endsWith(')')) return null\n return value.slice(fn.length + 1, -1).trim() || null\n}\n\n// An analyzed expression - contains the SQL string plus metadata for validation\nexport interface Expr {\n sql: string // the SQL for this expression, e.g. \"users.\\\"name\\\"\" or \"sum(users.\\\"amount\\\")\"\n type: FieldType // result type for validation\n metadata?: FieldMeta\n isAgg?: boolean // true if contains an aggregate function\n canWindow?: boolean // true if expression can be used with an OVER clause\n interval?: IntervalExpr\n fanout?: ExprFanout\n}\n\n// A field in a query's SELECT clause\nexport interface QueryField extends Expr {\n name: string // output column name\n disambiguatedName?: string // alternate inferred name used when output names would otherwise collide\n definitionLocation?: Location // where this field is defined when materialized into a view\n}\n\n// A filter (WHERE or HAVING)\nexport interface Filter {\n sql: string\n isAgg?: boolean // if true, goes in HAVING; otherwise WHERE\n}\n\n// Interval lowering metadata carried on interval-typed expressions, so later analysis\n// can rewrite them into the dialect-specific syntax each warehouse expects.\nexport interface IntervalExpr {\n quantitySql: string\n unit: TimestampUnit\n form: 'constant' | 'dynamic' | 'scaled'\n}\n\n// Context for analyzing expressions - table/alias change as we traverse joins, but query is shared\nexport interface Scope {\n file: FileInfo\n query?: Query // null when analyzing table definitions (not in a query context)\n table?: Table\n alias: string // current alias for this table context (e.g., \"users\", \"orders\", \"users_orders\")\n fanoutPath?: FanoutPath\n otherTables?: Table[] // CTEs and other tables visible for name resolution\n joinTarget?: {name: string; table: Table; alias: string} // When analyzing a join's ON clause, tells us about the target table/alias.\n}\n\nexport type JoinType = 'left' | 'right' | 'full' | 'inner' | 'cross'\n\n// A join relation used throughout analysis.\n// For table-defined joins, targetTable/onExpr are populated first.\n// For analyzed query joins, table/onClause are populated.\nexport interface QueryJoin {\n alias: string\n source: 'from' | 'ad-hoc' | 'implicit'\n table?: Table\n targetTable?: string\n cardinality?: 'one' | 'many'\n fanoutPath?: FanoutPath\n joinType?: JoinType\n onClause?: string\n onExpr?: SyntaxNode\n targetNode?: SyntaxNode\n unnestExpr?: Expr\n}\n\n// A fully analyzed query\nexport interface Query {\n sql: string // the complete SQL string\n fields: QueryField[] // SELECT columns\n joins: QueryJoin[] // JOINs needed for this query\n filters: Filter[] // WHERE/HAVING conditions\n groupBy: string[] // field names for GROUP BY\n orderBy: {idx: number; desc: boolean}[] // ORDER BY (1-indexed field indices)\n limit?: number\n setOp?: 'union' | 'union all' | 'intersect' | 'except'\n branches?: {query: Query; parenthesized?: boolean}[]\n}\n\n// A column definition (from table schema or computed)\nexport interface Column {\n name: string\n type: FieldType\n isAgg?: boolean // for computed columns that are aggregates\n exprNode?: SyntaxNode // for computed columns, the expression AST node (analyzed lazily in query context)\n metadata?: FieldMeta\n symbolId?: string\n location?: Location\n}\n\n// A table definition - discriminated union so views guarantee a query\ninterface TableBase {\n name: string\n tablePath: string\n filePath: string\n columns: Column[]\n joins: QueryJoin[]\n metadata?: Record<string, string>\n syntaxNode?: SyntaxNode\n symbolId?: string\n location?: Location\n}\nexport interface PhysicalTable extends TableBase {\n type: 'table'\n}\nexport interface ViewTable extends TableBase {\n type: 'view'\n query: Query\n analyzed?: boolean\n}\nexport interface CteTable extends TableBase {\n type: 'cte'\n query: Query\n}\nexport interface SubqueryTable extends TableBase {\n type: 'subquery'\n query: Query\n}\nexport type Table = PhysicalTable | ViewTable | CteTable | SubqueryTable\n\nexport interface Location {\n file: string\n from: Position\n to: Position\n}\n\nexport type NavigationSymbolKind = 'table' | 'column'\n\nexport interface NavigationSymbol {\n id: string\n kind: NavigationSymbolKind\n name: string\n location: Location\n tableId?: string\n hover?: string\n}\n\nexport interface NavigationReference {\n kind: NavigationSymbolKind\n location: Location\n targetId: string\n}\n\nexport interface FileNavigation {\n symbols: NavigationSymbol[]\n references: NavigationReference[]\n}\n\nexport interface FileInfo {\n path: string\n contents: string\n tree: Tree | null\n tables: Table[]\n queries: Query[]\n navigation: FileNavigation\n virtualContents?: string\n virtualToMarkdownOffset?: number[]\n parsedDiagnostics?: ParsedFileDiagnostic[]\n}\n", "// Fanout analysis models expression grain in terms of `join many` paths from the base table.\n// For example, `[]` is the base grain, `['orders']` is one row per order, and\n// `['orders', 'order_items']` is one row per order item.\nexport type FanoutPath = string[]\n\n// Fanout metadata carried on an analyzed expression.\nexport interface ExprFanout {\n path?: FanoutPath // the single row-grain this scalar expression depends on.\n sensitivePaths?: FanoutPath[] // aggregate grains in this expression that are sensitive to row duplication.\n conflict?: boolean // true when scalar subexpressions mix incompatible `join many` branches.\n}\n\nexport function extendFanoutPath(path: FanoutPath | undefined, segment?: string | null): FanoutPath {\n if (!segment) return [...(path || [])]\n return [...(path || []), segment]\n}\n\n// Normalize empty fanout objects away so \"missing\" continues to mean \"no fanout metadata\".\nexport function normalizeExprFanout(exprFanout: ExprFanout): ExprFanout | undefined {\n if (exprFanout.sensitivePaths?.length == 0) delete exprFanout.sensitivePaths\n if (!exprFanout.conflict) delete exprFanout.conflict\n if (exprFanout.path == null && !exprFanout.sensitivePaths && !exprFanout.conflict) return\n return exprFanout\n}\n\nexport function isBaseFanoutPath(path: FanoutPath | undefined): boolean {\n return !path || path.length == 0\n}\n\nexport function fanoutPathKey(path: FanoutPath | undefined): string {\n return isBaseFanoutPath(path) ? '__base__' : path!.join('.')\n}\n\nexport function formatFanoutPath(path: FanoutPath | undefined): string {\n return isBaseFanoutPath(path) ? 'base' : path!.join('.')\n}\n\nexport function formatGrains(paths: FanoutPath[]) {\n return uniqueFanoutPaths(paths).map(formatFanoutPath).join(', ')\n}\n\nexport function describeFanoutTarget(path: FanoutPath | undefined): string {\n return path?.[path.length - 1] || 'base table'\n}\n\nexport function fanoutMessage(path: FanoutPath | undefined, suffix: string): string {\n return `Expression is fanned out by join to table \\`${describeFanoutTarget(path)}\\`; ${suffix}`\n}\n\nexport function aggregateFanoutMessage(label: string, path: FanoutPath | undefined): string {\n return `Aggregate expression \\`${label}\\` is fanned out by join to table \\`${describeFanoutTarget(path)}\\``\n}\n\nexport function mergeFanoutPaths(paths: (FanoutPath | undefined)[]): {path?: FanoutPath; conflict?: boolean} {\n let merged: FanoutPath | undefined\n for (let path of paths) {\n if (!path) continue\n if (!merged) {\n merged = [...path]\n continue\n }\n if (isPrefix(merged, path)) {\n merged = [...path]\n continue\n }\n if (isPrefix(path, merged)) continue\n return {conflict: true}\n }\n return {path: merged}\n}\n\nexport function uniqueFanoutPaths(paths: FanoutPath[]): FanoutPath[] {\n let seen = new Set<string>()\n let unique: FanoutPath[] = []\n for (let path of paths) {\n let key = fanoutPathKey(path)\n if (seen.has(key)) continue\n seen.add(key)\n unique.push([...path])\n }\n return unique\n}\n\nexport function mergeSensitiveFanouts(...paths: (FanoutPath[] | undefined)[]): FanoutPath[] {\n return uniqueFanoutPaths(paths.flatMap(path => path || []))\n}\n\nexport function isPrefix(prefix: FanoutPath, path: FanoutPath): boolean {\n if (prefix.length > path.length) return false\n return prefix.every((part, i) => part == path[i])\n}\n\nexport function isChasmTrap(paths: FanoutPath[]): boolean {\n if (paths.length <= 1 || paths.some(path => path.length == 0)) return false\n for (let i = 0; i < paths.length; i++) {\n for (let j = i + 1; j < paths.length; j++) {\n if (isPrefix(paths[i], paths[j]) || isPrefix(paths[j], paths[i])) return false\n }\n }\n return true\n}\n\nexport function multiGrainMessage(paths: FanoutPath[]): string {\n if (isChasmTrap(paths)) return `Join graph creates a chasm trap (${formatGrains(paths)}). Aggregate each path in a subquery/CTE first`\n return `One or more aggregate expressions fanned out by join graph (${formatGrains(paths)}). Aggregate each grain in a subquery/CTE first`\n}\n", "import type {FieldMeta, TimeOrdinal} from './types.ts'\n\nfunction normalizeTemporalPart(rawPart?: string) {\n return String(rawPart || '')\n .trim()\n .replace(/^['\"]|['\"]$/g, '')\n .toLowerCase()\n}\n\n// Metadata for truncation/binning functions. The result remains temporal (date/timestamp),\n// so the part describes display resolution rather than an extracted number.\nexport function inferGrain(rawPart?: string): FieldMeta | undefined {\n let normalized = normalizeTemporalPart(rawPart)\n if (!normalized) return\n\n if (/^week(?:\\([a-z]+\\))?$/.test(normalized) || normalized == 'isoweek') return {timeGrain: 'week', defaultName: 'week'}\n if (normalized == 'isoyear') return {timeGrain: 'year', defaultName: 'year'}\n\n switch (normalized) {\n case 'year':\n case 'quarter':\n case 'month':\n case 'day':\n case 'hour':\n case 'minute':\n case 'second':\n return {timeGrain: normalized, defaultName: normalized}\n }\n}\n\n// Metadata for extraction functions like extract/date_part/hour(...). Most extracted\n// values are bounded ordinals (month-of-year, day-of-week, etc). Year is the exception:\n// it is unbounded, so we treat it as a numeric value at year grain instead of an ordinal.\nexport function inferTimeOrdinal(rawPart: string | undefined, dialect: string): FieldMeta | undefined {\n let normalized = normalizeTemporalPart(rawPart)\n if (normalized == 'year' || normalized == 'isoyear') return {timeGrain: 'year', defaultName: 'year'}\n\n let timeOrdinal: TimeOrdinal | undefined\n if (normalized == 'hour') timeOrdinal = 'hour_of_day'\n if (normalized == 'day' || normalized == 'dayofmonth') timeOrdinal = 'day_of_month'\n if (normalized == 'dayofyear' || normalized == 'doy') timeOrdinal = 'day_of_year'\n if (normalized == 'week' || normalized == 'weekofyear' || normalized == 'isoweek' || /^week(?:\\([a-z]+\\))?$/.test(normalized)) timeOrdinal = 'week_of_year'\n if (normalized == 'month') timeOrdinal = 'month_of_year'\n if (normalized == 'quarter') timeOrdinal = 'quarter_of_year'\n if (normalized == 'isodow' || normalized == 'dayofweekiso' || normalized == 'iso_dayofweek') timeOrdinal = 'dow_1m'\n\n if (normalized == 'dayofweek' || normalized == 'dow' || normalized == 'weekday') {\n if (dialect == 'bigquery') timeOrdinal = 'dow_1s'\n else if (dialect == 'clickhouse') timeOrdinal = 'dow_1m'\n else timeOrdinal = 'dow_0s'\n }\n\n if (!timeOrdinal) return\n if (/^week(?:\\([a-z]+\\))?$/.test(normalized)) return {timeOrdinal, defaultName: 'week'}\n\n let defaultNames: Record<string, string> = {\n dow: 'dayofweek',\n weekday: 'dayofweek',\n dayofmonth: 'day',\n doy: 'dayofyear',\n weekofyear: 'week',\n dayofweekiso: 'isodow',\n iso_dayofweek: 'isodow',\n }\n return {timeOrdinal, defaultName: defaultNames[normalized] || normalized}\n}\n", "import type {SyntaxNode, SyntaxNodeRef} from '@lezer/common'\n\nimport type {FileInfo} from './types.ts'\n\nfunction markdownOffset(offset: number, file: FileInfo) {\n let map = file.virtualToMarkdownOffset\n if (!map || map.length === 0) return offset\n if (offset <= 0) return map[0] ?? 0\n if (offset >= map.length) return map[map.length - 1]\n return map[offset]\n}\n\nfunction virtualOffset(offset: number, file: FileInfo) {\n let map = file.virtualToMarkdownOffset\n if (!map || map.length === 0) return offset\n if (offset <= map[0]) return 0\n if (offset >= map[map.length - 1]) return map.length - 1\n\n let low = 0\n let high = map.length - 1\n while (low < high) {\n let mid = Math.floor((low + high) / 2)\n if (map[mid] >= offset) high = mid\n else low = mid + 1\n }\n return low\n}\n\nexport function getPosition(offset: number, file: FileInfo) {\n let mdOffset = markdownOffset(offset, file)\n let lines = file.contents.split(/\\r?\\n/)\n let acc = 0\n for (let i = 0; i < lines.length; i++) {\n let lineText = lines[i]\n let nextAcc = acc + lineText.length + 1\n if (mdOffset < nextAcc || i === lines.length - 1) {\n let col = Math.max(0, mdOffset - acc)\n return {offset: mdOffset, line: i, col, lineStart: acc, lineText}\n }\n acc = nextAcc\n }\n return {offset: mdOffset, line: 1, col: 0}\n}\n\nexport function getSourceOffset(line: number, col: number, file: FileInfo) {\n let lines = file.contents.split(/\\r?\\n/)\n let acc = 0\n for (let i = 0; i < line; i++) {\n acc += lines[i].length + 1\n }\n return acc + col\n}\n\nexport function getOffset(line: number, col: number, file: FileInfo) {\n let offset = getSourceOffset(line, col, file)\n if (file.virtualContents) return virtualOffset(offset, file)\n return offset\n}\n\nexport function getFile(node: SyntaxNode | SyntaxNodeRef): FileInfo {\n if (node.node) node = node.node\n let top: SyntaxNode = node as SyntaxNode\n while (top.parent) top = top.parent\n return top!.tree!.fileInfo!\n}\n\nexport function txt(node: SyntaxNode | null | undefined) {\n if (!node) return ''\n let file = getFile(node)\n let source = file.virtualContents ?? file.contents\n return source.substring(node.from, node.to) || ''\n}\n\nexport function compact<T>(obj: T): T {\n return Object.fromEntries(Object.entries(obj as any).filter(([_, v]) => v !== undefined)) as T\n}\n\nexport function trimIndentation(str: string) {\n let lines = str.trim().split('\\n')\n let indent = lines\n .slice(1)\n .filter(l => l.trim() !== '')\n .map(l => l.match(/^\\s*/)![0].length)\n\n let toRemove = Math.min(...indent)\n return lines\n .map((line, index) => {\n if (index == 0) return line\n if (line.trim() === '') return ''\n return line.slice(toRemove)\n })\n .join('\\n')\n}\n\nexport function toRelativePath(path: string): string {\n return path\n .replace(/^file:\\/\\//, '')\n .replace(/\\\\/g, '/')\n .replace(/^\\/+/, '')\n}\n\nexport function buildFrame(from: {line: number; col: number; lineText?: string}, to: {line: number; col: number}) {\n let lineText = from.lineText || ''\n let endCol = from.line === to.line ? Math.max(from.col + 1, to.col) : lineText.length\n let safeEnd = Math.max(from.col + 1, Math.min(lineText.length, endCol))\n let caretLen = Math.max(1, safeEnd - from.col)\n return `${lineText}\\n${' '.repeat(from.col)}${'^'.repeat(caretLen)}`\n}\n\nexport async function pollFor<T>(fn: () => T, timeoutMs: number, interval?: number): Promise<T | null> {\n let end = Date.now() + timeoutMs\n while (Date.now() < end) {\n let res = fn()\n if (res) return res\n await new Promise(r => setTimeout(r, interval))\n }\n return null\n}\n", "// BigQuery SQL function definitions\n// These get converted to Malloy blueprints in functions.ts\n//\n// Documentation is copied verbatim from:\n// https://cloud.google.com/bigquery/docs/reference/standard-sql/\n\nimport type {FunctionDef} from './functionTypes.ts'\n\nimport {inferGrain} from './temporalMetadata.ts'\nimport {trimIndentation} from './util.ts'\n\nconst bq = 'https://cloud.google.com/bigquery/docs/reference/standard-sql'\n\n// Helper to trim and dedent multiline strings\nconst trim = trimIndentation\n\nexport const bigQueryFunctions: FunctionDef[] = [\n // ============================================================================\n // Window Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/window-functions\n // ============================================================================\n {\n name: 'row_number',\n description: trim('ROW_NUMBER() returns the sequential row number (1-based) of each row within a window.'),\n url: `${bq}/numbering_functions#row_number`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'rank',\n description: trim('RANK() returns the rank of each row within a window, with gaps for ties.'),\n url: `${bq}/numbering_functions#rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'dense_rank',\n description: trim('DENSE_RANK() returns the rank of each row within a window, without gaps.'),\n url: `${bq}/numbering_functions#dense_rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'ntile',\n description: trim('NTILE(constant_integer_expression) returns the bucket number for each row in a window.'),\n url: `${bq}/numbering_functions#ntile`,\n args: [{name: 'constant_integer_expression', type: 'number'}],\n returns: 'number',\n window: true,\n },\n {\n name: 'lag',\n description: trim('LAG(value_expression, offset, default_expression) returns data from a previous row in a window.'),\n url: `${bq}/navigation_functions#lag`,\n args: [\n {name: 'value_expression', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default_expression', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'lead',\n description: trim('LEAD(value_expression, offset, default_expression) returns data from a following row in a window.'),\n url: `${bq}/navigation_functions#lead`,\n args: [\n {name: 'value_expression', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default_expression', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'first_value',\n description: trim('FIRST_VALUE(value_expression) returns the first value in the current window frame.'),\n url: `${bq}/navigation_functions#first_value`,\n args: [{name: 'value_expression', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'last_value',\n description: trim('LAST_VALUE(value_expression) returns the last value in the current window frame.'),\n url: `${bq}/navigation_functions#last_value`,\n args: [{name: 'value_expression', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'nth_value',\n description: trim('NTH_VALUE(value_expression, constant_integer_expression) returns the nth value in the frame.'),\n url: `${bq}/navigation_functions#nth_value`,\n args: [\n {name: 'value_expression', type: 'T'},\n {name: 'constant_integer_expression', type: 'number'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'percent_rank',\n description: trim('PERCENT_RANK() returns the percentile rank of each row in the partition.'),\n url: `${bq}/numbering_functions#percent_rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'cume_dist',\n description: trim('CUME_DIST() returns the cumulative distribution value for each row in the partition.'),\n url: `${bq}/numbering_functions#cume_dist`,\n args: [],\n returns: 'number',\n window: true,\n },\n\n // ============================================================================\n // Aggregate Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/aggregate_functions\n // ============================================================================\n\n {\n name: 'any_value',\n description: trim(`\n ANY_VALUE(expression [HAVING {MAX | MIN} having_expression]) [OVER over_clause]\n\n Returns \\`expression\\` for some row chosen from the group. Which row is chosen is nondeterministic, not random. Returns \\`NULL\\` when the input produces no rows. Returns \\`NULL\\` when \\`expression\\` or \\`having_expression\\` is \\`NULL\\` for all rows in the group.\n\n If \\`expression\\` contains any non-NULL values, then \\`ANY_VALUE\\` behaves as if \\`IGNORE NULLS\\` is specified; rows for which \\`expression\\` is \\`NULL\\` aren't considered and won't be selected.\n\n If the \\`HAVING\\` clause is included in the \\`ANY_VALUE\\` function, the \\`OVER\\` clause can't be used with this function.\n\n Supported Argument Types: Any\n Returned Data Types: Matches the input data type.\n `),\n url: `${bq}/aggregate_functions#any_value`,\n args: [{name: 'expression', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'array_agg',\n description: trim(`\n ARRAY_AGG([DISTINCT] expression [{IGNORE | RESPECT} NULLS] [ORDER BY key [{ASC | DESC}] [, ...]] [LIMIT n]) [OVER over_clause]\n\n Returns an ARRAY of \\`expression\\` values.\n\n An error is raised if an array in the final query result contains a \\`NULL\\` element.\n\n Supported Argument Types: All data types except ARRAY.\n Returned Data Types: ARRAY. If there are zero input rows, this function returns \\`NULL\\`.\n `),\n url: `${bq}/aggregate_functions#array_agg`,\n args: [{name: 'expression', type: 'T', description: 'All data types except ARRAY.'}],\n returns: 'array',\n aggregate: true,\n },\n {\n name: 'array_concat_agg',\n description: trim(`\n ARRAY_CONCAT_AGG(expression [ORDER BY key [{ASC | DESC}] [, ...]] [LIMIT n])\n\n Concatenates elements from \\`expression\\` of type ARRAY, returning a single ARRAY as a result. This function ignores \\`NULL\\` input arrays, but respects the \\`NULL\\` elements in non-\\`NULL\\` input arrays. Returns \\`NULL\\` if there are zero input rows or \\`expression\\` evaluates to \\`NULL\\` for all rows.\n\n Supported Argument Types: ARRAY\n Returned Data Types: ARRAY\n `),\n url: `${bq}/aggregate_functions#array_concat_agg`,\n args: [{name: 'expression', type: 'array'}],\n returns: 'array',\n aggregate: true,\n },\n {\n name: 'avg',\n description: trim(`\n AVG([DISTINCT] expression) [OVER over_clause]\n\n Returns the average of non-\\`NULL\\` values in an aggregated group.\n\n Caveats:\n - If the aggregated group is empty or the argument is \\`NULL\\` for all rows in the group, returns \\`NULL\\`.\n - If the argument is \\`NaN\\` for any row in the group, returns \\`NaN\\`.\n - If the argument is \\`[+|-]Infinity\\` for any row in the group, returns either \\`[+|-]Infinity\\` or \\`NaN\\`.\n - If there is numeric overflow, produces an error.\n - If a floating-point type is returned, the result is non-deterministic, which means you might receive a different result each time you use this function.\n\n Supported Argument Types: Any numeric input type, INTERVAL\n Returned Data Types: FLOAT64 for INT64 inputs, NUMERIC for NUMERIC inputs, BIGNUMERIC for BIGNUMERIC inputs, FLOAT64 for FLOAT64 inputs, INTERVAL for INTERVAL inputs.\n `),\n url: `${bq}/aggregate_functions#avg`,\n args: [{name: 'expression', type: 'number', description: 'Any numeric input type or INTERVAL.'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bit_and',\n description: trim(`\n BIT_AND([DISTINCT] expression)\n\n Performs a bitwise AND operation on \\`expression\\` and returns the result.\n\n Supported Argument Types: INT64\n Returned Data Types: INT64\n `),\n url: `${bq}/aggregate_functions#bit_and`,\n args: [{name: 'expression', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bit_or',\n description: trim(`\n BIT_OR([DISTINCT] expression)\n\n Performs a bitwise OR operation on \\`expression\\` and returns the result.\n\n Supported Argument Types: INT64\n Returned Data Types: INT64\n `),\n url: `${bq}/aggregate_functions#bit_or`,\n args: [{name: 'expression', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bit_xor',\n description: trim(`\n BIT_XOR([DISTINCT] expression)\n\n Performs a bitwise XOR operation on \\`expression\\` and returns the result.\n\n Supported Argument Types: INT64\n Returned Data Types: INT64\n `),\n url: `${bq}/aggregate_functions#bit_xor`,\n args: [{name: 'expression', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'count',\n description: trim(`\n COUNT(*) [OVER over_clause]\n COUNT([DISTINCT] expression) [OVER over_clause]\n\n Returns the number of rows in the input, or the number of rows with an expression evaluated to any value other than \\`NULL\\`.\n\n Definitions:\n - \\`*\\`: Returns the number of all rows in the input.\n - \\`expression\\`: A value of any data type that represents the expression to evaluate. If \\`DISTINCT\\` is present, \\`expression\\` can only be a data type that is groupable.\n - \\`DISTINCT\\`: Each distinct value of \\`expression\\` is aggregated only once into the result.\n\n Details:\n To count the number of distinct values of an expression for which a certain condition is satisfied, you can use: COUNT(DISTINCT IF(condition, expression, NULL))\n\n Returned Data Types: INT64\n `),\n url: `${bq}/aggregate_functions#count`,\n args: [{name: 'expression', type: 'any?', description: 'A value of any data type. If DISTINCT is present, expression can only be a groupable data type.'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'countif',\n aliases: ['count_if'],\n description: trim(`\n COUNTIF([DISTINCT] expression) [OVER over_clause]\n\n Returns the count of \\`TRUE\\` values for \\`expression\\`. Returns \\`0\\` if there are zero input rows, or if \\`expression\\` evaluates to \\`FALSE\\` or \\`NULL\\` for all rows.\n\n Definitions:\n - \\`expression\\`: A \\`BOOL\\` value that represents the expression to evaluate.\n\n Details:\n The function signature \\`COUNTIF(DISTINCT ...)\\` is generally not useful. If you would like to use \\`DISTINCT\\`, use \\`COUNT\\` with \\`DISTINCT IF\\`.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/aggregate_functions#countif`,\n args: [{name: 'expression', type: 'boolean', description: 'A BOOL value that represents the expression to evaluate.'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'logical_and',\n description: trim(`\n LOGICAL_AND(expression)\n\n Returns the logical AND of all non-\\`NULL\\` expressions. Returns \\`NULL\\` if there are zero input rows or \\`expression\\` evaluates to \\`NULL\\` for all rows.\n\n Supported Argument Types: BOOL\n Returned Data Types: BOOL\n `),\n url: `${bq}/aggregate_functions#logical_and`,\n args: [{name: 'expression', type: 'boolean'}],\n returns: 'boolean',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'logical_or',\n description: trim(`\n LOGICAL_OR(expression)\n\n Returns the logical OR of all non-\\`NULL\\` expressions. Returns \\`NULL\\` if there are zero input rows or \\`expression\\` evaluates to \\`NULL\\` for all rows.\n\n Supported Argument Types: BOOL\n Returned Data Types: BOOL\n `),\n url: `${bq}/aggregate_functions#logical_or`,\n args: [{name: 'expression', type: 'boolean'}],\n returns: 'boolean',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'max',\n description: trim(`\n MAX(expression) [OVER over_clause]\n\n Returns the maximum non-\\`NULL\\` value in an aggregated group.\n\n Caveats:\n - If the aggregated group is empty or the argument is \\`NULL\\` for all rows in the group, returns \\`NULL\\`.\n - If the argument is \\`NaN\\` for any row in the group, returns \\`NaN\\`.\n\n Supported Argument Types: Any orderable data type except for ARRAY.\n Returned Data Types: The data type of the input values.\n `),\n url: `${bq}/aggregate_functions#max`,\n args: [{name: 'expression', type: 'T', description: 'Any orderable data type except for ARRAY.'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'max_by',\n description: trim(`\n MAX_BY(x, y)\n\n Returns the value of \\`x\\` associated with the maximum value of \\`y\\` in an aggregated group.\n\n Definitions:\n - \\`x\\`: The value to return.\n - \\`y\\`: The value used to determine the maximum.\n\n Caveats:\n - If the aggregated group is empty, returns \\`NULL\\`.\n - If the maximum value of \\`y\\` is \\`NULL\\`, returns the corresponding value of \\`x\\`.\n\n Supported Argument Types: \\`x\\` can be any type. \\`y\\` must be an orderable data type.\n Returned Data Types: The type of \\`x\\`.\n `),\n url: `${bq}/aggregate_functions#max_by`,\n args: [\n {name: 'x', type: 'T', description: 'The value to return.'},\n {name: 'y', type: 'any', description: 'The value used to determine the maximum. Must be an orderable data type.'},\n ],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'min',\n description: trim(`\n MIN(expression) [OVER over_clause]\n\n Returns the minimum non-\\`NULL\\` value in an aggregated group.\n\n Caveats:\n - If the aggregated group is empty or the argument is \\`NULL\\` for all rows in the group, returns \\`NULL\\`.\n - If the argument is \\`NaN\\` for any row in the group, returns \\`NaN\\`.\n\n Supported Argument Types: Any orderable data type except for ARRAY.\n Returned Data Types: The data type of the input values.\n `),\n url: `${bq}/aggregate_functions#min`,\n args: [{name: 'expression', type: 'T', description: 'Any orderable data type except for ARRAY.'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'min_by',\n description: trim(`\n MIN_BY(x, y)\n\n Returns the value of \\`x\\` associated with the minimum value of \\`y\\` in an aggregated group.\n\n Definitions:\n - \\`x\\`: The value to return.\n - \\`y\\`: The value used to determine the minimum.\n\n Caveats:\n - If the aggregated group is empty, returns \\`NULL\\`.\n - If the minimum value of \\`y\\` is \\`NULL\\`, returns the corresponding value of \\`x\\`.\n\n Supported Argument Types: \\`x\\` can be any type. \\`y\\` must be an orderable data type.\n Returned Data Types: The type of \\`x\\`.\n `),\n url: `${bq}/aggregate_functions#min_by`,\n args: [\n {name: 'x', type: 'T', description: 'The value to return.'},\n {name: 'y', type: 'any', description: 'The value used to determine the minimum. Must be an orderable data type.'},\n ],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'string_agg',\n description: trim(`\n STRING_AGG([DISTINCT] expression [, delimiter] [ORDER BY key [{ASC | DESC}] [, ...]] [LIMIT n]) [OVER over_clause]\n\n Returns a value (either STRING or BYTES) obtained by concatenating non-\\`NULL\\` values. Returns \\`NULL\\` if there are zero input rows or \\`expression\\` evaluates to \\`NULL\\` for all rows.\n\n If a \\`delimiter\\` is specified, concatenated values are separated by that delimiter; otherwise, a comma is used as a delimiter.\n\n Supported Argument Types: Either STRING or BYTES.\n Returned Data Types: Either STRING or BYTES.\n `),\n url: `${bq}/aggregate_functions#string_agg`,\n args: [\n {name: 'expression', type: 'string', description: 'Either STRING or BYTES.'},\n {name: 'delimiter', type: 'string?', description: 'The delimiter to use. Defaults to comma.'},\n ],\n returns: 'string',\n aggregate: true,\n },\n {\n name: 'sum',\n description: trim(`\n SUM([DISTINCT] expression) [OVER over_clause]\n\n Returns the sum of non-\\`NULL\\` values in an aggregated group.\n\n Caveats:\n - If the aggregated group is empty or the argument is \\`NULL\\` for all rows in the group, returns \\`NULL\\`.\n - If the argument is \\`NaN\\` for any row in the group, returns \\`NaN\\`.\n - If the argument is \\`[+|-]Infinity\\` for any row in the group, returns either \\`[+|-]Infinity\\` or \\`NaN\\`.\n - If there is numeric overflow, produces an error.\n - If a floating-point type is returned, the result is non-deterministic, which means you might receive a different result each time you use this function.\n\n Supported Argument Types: Any supported numeric data type, INTERVAL\n Returned Data Types: INT64 for INT64 inputs, NUMERIC for NUMERIC inputs, BIGNUMERIC for BIGNUMERIC inputs, FLOAT64 for FLOAT64 inputs, INTERVAL for INTERVAL inputs.\n `),\n url: `${bq}/aggregate_functions#sum`,\n args: [{name: 'expression', type: 'number', description: 'Any supported numeric data type or INTERVAL.'}],\n returns: 'number',\n aggregate: true,\n },\n\n // ============================================================================\n // Mathematical Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions\n // ============================================================================\n\n {\n name: 'abs',\n description: trim(`\n ABS(X)\n\n Computes the absolute value. Returns an error if the argument is an integer and the output value cannot be represented as the same type; this happens only for the largest negative input value, which has no positive representation.\n\n Supported Argument Types: Any numeric type\n Returned Data Types: Same type as input\n `),\n url: `${bq}/mathematical_functions#abs`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'acos',\n description: trim(`\n ACOS(X)\n\n Computes the principal value of the inverse cosine of X. The return value is in the range [0,\u03C0]. Generates an error if X is a value outside of the range [-1, 1].\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#acos`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'acosh',\n description: trim(`\n ACOSH(X)\n\n Computes the inverse hyperbolic cosine of X. Generates an error if X is a value less than 1.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#acosh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'asin',\n description: trim(`\n ASIN(X)\n\n Computes the principal value of the inverse sine of X. The return value is in the range [-\u03C0/2,\u03C0/2]. Generates an error if X is outside of the range [-1, 1].\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#asin`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'asinh',\n description: trim(`\n ASINH(X)\n\n Computes the inverse hyperbolic sine of X. Does not fail.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#asinh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'atan',\n description: trim(`\n ATAN(X)\n\n Computes the principal value of the inverse tangent of X. The return value is in the range [-\u03C0/2,\u03C0/2]. Does not fail.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#atan`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'atan2',\n description: trim(`\n ATAN2(X, Y)\n\n Calculates the principal value of the inverse tangent of X/Y using the signs of the two arguments to determine the quadrant. The return value is in the range [-\u03C0,\u03C0].\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#atan2`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'atanh',\n description: trim(`\n ATANH(X)\n\n Computes the inverse hyperbolic tangent of X. Generates an error if X is outside of the range (-1, 1).\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#atanh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cbrt',\n description: trim(`\n CBRT(X)\n\n Computes the cube root of X. X can be any data type that coerces to FLOAT64. This function does not fail.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#cbrt`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'ceil',\n description: trim(`\n CEIL(X)\n\n Returns the smallest integral value that is not less than X.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#ceil`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'ceiling',\n description: trim(`\n CEILING(X)\n\n Synonym of CEIL(X).\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#ceiling`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cos',\n description: trim(`\n COS(X)\n\n Computes the cosine of X where X is specified in radians. Never fails.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#cos`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cosh',\n description: trim(`\n COSH(X)\n\n Computes the hyperbolic cosine of X where X is specified in radians. Generates an error if overflow occurs.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#cosh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cot',\n description: trim(`\n COT(X)\n\n Computes the cotangent of X where X is specified in radians. Generates an error if X is 0.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#cot`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'coth',\n description: trim(`\n COTH(X)\n\n Computes the hyperbolic cotangent of X where X is specified in radians. Generates an error if X is 0.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#coth`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'csc',\n description: trim(`\n CSC(X)\n\n Computes the cosecant of X where X is specified in radians. Generates an error if X is 0.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#csc`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'csch',\n description: trim(`\n CSCH(X)\n\n Computes the hyperbolic cosecant of X where X is specified in radians. Generates an error if X is 0.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#csch`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'div',\n description: trim(`\n DIV(X, Y)\n\n Returns the result of integer division of X by Y. Division by zero returns an error. Division by -1 may overflow.\n\n Supported Argument Types: X and Y must both be integer types.\n Returned Data Types: The larger of the two argument types.\n `),\n url: `${bq}/mathematical_functions#div`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'exp',\n description: trim(`\n EXP(X)\n\n Computes e to the power of X, also called the natural exponential function. If the result underflows, this function returns a zero. Generates an error if the result overflows.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#exp`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'floor',\n description: trim(`\n FLOOR(X)\n\n Returns the largest integral value that is not greater than X.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#floor`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'greatest',\n description: trim(`\n GREATEST(X1,...,XN)\n\n Returns the greatest value among X1,...,XN. If any argument is NULL, returns NULL. Otherwise, in the case of floating-point arguments, if any argument is NaN, returns NaN. In all other cases, returns the value among X1,...,XN that has the greatest value according to the ordering used by the ORDER BY clause.\n\n Supported Argument Types: Any type\n Returned Data Types: The supertype of the input types.\n `),\n url: `${bq}/mathematical_functions#greatest`,\n args: [['values', 'T...']],\n returns: 'T',\n },\n {\n name: 'is_inf',\n description: trim(`\n IS_INF(X)\n\n Returns TRUE if the value is positive or negative infinity.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: BOOL\n `),\n url: `${bq}/mathematical_functions#is_inf`,\n args: [['x', 'number']],\n returns: 'boolean',\n },\n {\n name: 'is_nan',\n description: trim(`\n IS_NAN(X)\n\n Returns TRUE if the value is a NaN value.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: BOOL\n `),\n url: `${bq}/mathematical_functions#is_nan`,\n args: [['x', 'number']],\n returns: 'boolean',\n },\n {\n name: 'least',\n description: trim(`\n LEAST(X1,...,XN)\n\n Returns the least value among X1,...,XN. If any argument is NULL, returns NULL. Otherwise, in the case of floating-point arguments, if any argument is NaN, returns NaN. In all other cases, returns the value among X1,...,XN that has the least value according to the ordering used by the ORDER BY clause.\n\n Supported Argument Types: Any type\n Returned Data Types: The supertype of the input types.\n `),\n url: `${bq}/mathematical_functions#least`,\n args: [['values', 'T...']],\n returns: 'T',\n },\n {\n name: 'ln',\n description: trim(`\n LN(X)\n\n Computes the natural logarithm of X. Generates an error if X is less than or equal to zero.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#ln`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'log',\n description: trim(`\n LOG(X [, Y])\n\n If only X is present, LOG is a synonym of LN. If Y is also present, LOG computes the logarithm of X to base Y. Generates an error in these cases: X is less than or equal to zero; Y is 1.0; Y is less than or equal to zero.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#log`,\n args: [\n ['x', 'number'],\n ['y', 'number?'],\n ],\n returns: 'number',\n },\n {\n name: 'log10',\n description: trim(`\n LOG10(X)\n\n Similar to LOG, but computes logarithm to base 10.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#log10`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'mod',\n description: trim(`\n MOD(X, Y)\n\n Modulo function: returns the remainder of the division of X by Y. Returned value has the same sign as X. An error is generated if Y is 0.\n\n Supported Argument Types: X and Y must both be integer types, or both arguments must be NUMERIC, or both arguments must be BIGNUMERIC.\n Returned Data Types: The larger of the two argument types.\n `),\n url: `${bq}/mathematical_functions#mod`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'pow',\n description: trim(`\n POW(X, Y)\n\n Returns the value of X raised to the power of Y. If the result underflows and is not representable, then the function returns a value of zero.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#pow`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'power',\n description: trim(`\n POWER(X, Y)\n\n Synonym of POW(X, Y).\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#power`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'rand',\n description: trim(`\n RAND()\n\n Generates a pseudo-random value of type FLOAT64 in the range of [0, 1), inclusive of 0 and exclusive of 1.\n\n Supported Argument Types: None\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#rand`,\n args: [],\n returns: 'number',\n },\n {\n name: 'round',\n description: trim(`\n ROUND(X [, N])\n\n If only X is present, rounds X to the nearest integer. If N is present, rounds X to N decimal places after the decimal point. If N is negative, rounds off digits to the left of the decimal point. Rounds halfway cases away from zero. Generates an error if overflow occurs.\n\n Supported Argument Types: X can be any numeric type. N must be INT64.\n Returned Data Types: If X is FLOAT64, returns FLOAT64. Otherwise returns NUMERIC or BIGNUMERIC.\n `),\n url: `${bq}/mathematical_functions#round`,\n args: [\n ['x', 'number'],\n ['n', 'number?'],\n ],\n returns: 'number',\n },\n {\n name: 'safe_add',\n description: trim(`\n SAFE_ADD(X, Y)\n\n Equivalent to the addition operator (+), but returns NULL if overflow occurs.\n\n Supported Argument Types: Any numeric type\n Returned Data Types: Same as input types\n `),\n url: `${bq}/mathematical_functions#safe_add`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'safe_divide',\n description: trim(`\n SAFE_DIVIDE(X, Y)\n\n Equivalent to the division operator (/), but returns NULL if an error occurs, such as a division by zero error.\n\n Supported Argument Types: Any numeric type\n Returned Data Types: FLOAT64 for integer inputs, or same as input for other types.\n `),\n url: `${bq}/mathematical_functions#safe_divide`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'safe_multiply',\n description: trim(`\n SAFE_MULTIPLY(X, Y)\n\n Equivalent to the multiplication operator (*), but returns NULL if overflow occurs.\n\n Supported Argument Types: Any numeric type\n Returned Data Types: Same as input types\n `),\n url: `${bq}/mathematical_functions#safe_multiply`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'safe_negate',\n description: trim(`\n SAFE_NEGATE(X)\n\n Equivalent to the unary minus operator (-), but returns NULL if overflow occurs.\n\n Supported Argument Types: Any numeric type\n Returned Data Types: Same as input type\n `),\n url: `${bq}/mathematical_functions#safe_negate`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'safe_subtract',\n description: trim(`\n SAFE_SUBTRACT(X, Y)\n\n Equivalent to the subtraction operator (-), but returns NULL if overflow occurs.\n\n Supported Argument Types: Any numeric type\n Returned Data Types: Same as input types\n `),\n url: `${bq}/mathematical_functions#safe_subtract`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'sec',\n description: trim(`\n SEC(X)\n\n Computes the secant of X where X is specified in radians. Never fails.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#sec`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sech',\n description: trim(`\n SECH(X)\n\n Computes the hyperbolic secant of X where X is specified in radians. Never fails.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#sech`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sign',\n description: trim(`\n SIGN(X)\n\n Returns -1, 0, or +1 for negative, zero and positive arguments respectively. For floating point arguments, this function does not distinguish between positive and negative zero.\n\n Supported Argument Types: Any numeric type\n Returned Data Types: Same as input type\n `),\n url: `${bq}/mathematical_functions#sign`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sin',\n description: trim(`\n SIN(X)\n\n Computes the sine of X where X is specified in radians. Never fails.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#sin`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sinh',\n description: trim(`\n SINH(X)\n\n Computes the hyperbolic sine of X where X is specified in radians. Generates an error if overflow occurs.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#sinh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sqrt',\n description: trim(`\n SQRT(X)\n\n Computes the square root of X. Generates an error if X is less than 0.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#sqrt`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'tan',\n description: trim(`\n TAN(X)\n\n Computes the tangent of X where X is specified in radians. Generates an error if overflow occurs.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#tan`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'tanh',\n description: trim(`\n TANH(X)\n\n Computes the hyperbolic tangent of X where X is specified in radians. Does not fail.\n\n Supported Argument Types: FLOAT64\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/mathematical_functions#tanh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'trunc',\n description: trim(`\n TRUNC(X [, N])\n\n If only X is present, TRUNC rounds X to the nearest integer whose absolute value is not greater than the absolute value of X. If N is also present, TRUNC behaves like ROUND(X, N), but always rounds towards zero and never overflows.\n\n Supported Argument Types: X can be any numeric type. N must be INT64.\n Returned Data Types: If X is FLOAT64, returns FLOAT64. Otherwise returns NUMERIC or BIGNUMERIC.\n `),\n url: `${bq}/mathematical_functions#trunc`,\n args: [\n ['x', 'number'],\n ['n', 'number?'],\n ],\n returns: 'number',\n },\n\n // ============================================================================\n // String Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/string_functions\n // ============================================================================\n\n {\n name: 'ascii',\n description: trim(`\n ASCII(value)\n\n Returns the ASCII code for the first character or byte of value. Returns 0 if value is empty or the ASCII code is 0 for the first character or byte.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#ascii`,\n args: [['value', 'string']],\n returns: 'number',\n },\n {\n name: 'byte_length',\n description: trim(`\n BYTE_LENGTH(value)\n\n Gets the number of BYTES in a STRING or BYTES value, regardless of whether the value is a STRING or BYTES type.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#byte_length`,\n args: [['value', 'string']],\n returns: 'number',\n },\n {\n name: 'char_length',\n description: trim(`\n CHAR_LENGTH(value)\n\n Gets the number of characters in a STRING value.\n\n Supported Argument Types: STRING\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#char_length`,\n args: [['value', 'string']],\n returns: 'number',\n },\n {\n name: 'character_length',\n description: trim(`\n CHARACTER_LENGTH(value)\n\n Synonym for CHAR_LENGTH.\n\n Supported Argument Types: STRING\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#character_length`,\n args: [['value', 'string']],\n returns: 'number',\n },\n {\n name: 'chr',\n description: trim(`\n CHR(value)\n\n Takes a Unicode code point and returns the character that matches the code point. Each valid code point should fall within the range of [0, 0xD7FF] and [0xE000, 0x10FFFF]. Returns an empty string if the code point is 0. If an invalid Unicode code point is specified, an error is returned.\n\n Supported Argument Types: INT64\n Returned Data Types: STRING\n `),\n url: `${bq}/string_functions#chr`,\n args: [['value', 'number']],\n returns: 'string',\n },\n {\n name: 'concat',\n description: trim(`\n CONCAT(value1[, ...])\n\n Concatenates one or more values into a single result. All values must be BYTES or data types that can be cast to STRING. The function returns NULL if any input argument is NULL.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#concat`,\n args: [['values', 'string...']],\n returns: 'string',\n },\n {\n name: 'contains_substr',\n description: trim(`\n CONTAINS_SUBSTR(expression, search_value_literal[, json_scope=>json_scope_value])\n\n Performs a normalized, case-insensitive search to see if a value exists as a substring in an expression. Returns TRUE if the value exists, otherwise returns FALSE.\n\n Before values are compared, they are normalized and case folded with NFKC normalization. Wildcard searches are not supported.\n\n Definitions:\n - search_value_literal: The value to search for. It must be a STRING literal or a STRING constant expression.\n - expression: The data to search over. The expression can be a column or table reference. A table reference is evaluated as a STRUCT whose fields are the columns of the table. When the expression is evaluated, the result is cast to a STRING, and then the function looks for the search value in the result.\n - json_scope: A named argument with a STRING value. Takes 'JSON_VALUES' (default), 'JSON_KEYS', or 'JSON_KEYS_AND_VALUES' to indicate the scope of JSON data to be searched.\n\n Returned Data Types: BOOL\n `),\n url: `${bq}/string_functions#contains_substr`,\n args: [\n {name: 'expression', type: 'any', description: 'The data to search over. The expression can be a column or table reference.'},\n {name: 'search_value_literal', type: 'string', description: 'The value to search for. It must be a STRING literal or a STRING constant expression.'},\n {\n name: 'json_scope',\n type: 'string?',\n description: \"A named argument with a STRING value. Takes 'JSON_VALUES' (default), 'JSON_KEYS', or 'JSON_KEYS_AND_VALUES' to indicate the scope of JSON data to be searched.\",\n },\n ],\n returns: 'boolean',\n },\n {\n name: 'ends_with',\n description: trim(`\n ENDS_WITH(value, suffix)\n\n Takes two STRING or BYTES values. Returns TRUE if suffix is a suffix of value.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: BOOL\n `),\n url: `${bq}/string_functions#ends_with`,\n args: [\n ['value', 'string'],\n ['suffix', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'format',\n description: trim(`\n FORMAT(format_string_expression, data_type_expression[, ...])\n\n Formats a data type expression as a string. All expressions are supported except for ARRAY, STRUCT, and GEOGRAPHY.\n\n Supported Argument Types: format_string_expression must be STRING. data_type_expression can be any type except ARRAY, STRUCT, GEOGRAPHY.\n Returned Data Types: STRING\n `),\n url: `${bq}/string_functions#format`,\n args: [\n ['format_string', 'string'],\n ['values', 'any...'],\n ],\n returns: 'string',\n },\n {\n name: 'initcap',\n description: trim(`\n INITCAP(value[, delimiters])\n\n Takes a STRING value and returns it with the first character in each word in uppercase and all other characters in lowercase. Non-alphabetic characters remain the same.\n\n Definitions:\n - value: The STRING value to format.\n - delimiters: A STRING value containing the characters that define word boundaries. Defaults to space.\n\n Supported Argument Types: STRING\n Returned Data Types: STRING\n `),\n url: `${bq}/string_functions#initcap`,\n args: [\n {name: 'value', type: 'string', description: 'The STRING value to format.'},\n {name: 'delimiters', type: 'string?', description: 'A STRING value containing the characters that define word boundaries. Defaults to space.'},\n ],\n returns: 'string',\n },\n {\n name: 'instr',\n description: trim(`\n INSTR(value, subvalue[, position[, occurrence]])\n\n Returns the 1-based position of the first occurrence of subvalue inside value, starting from position and optionally searching for the nth occurrence. Returns 0 if no match is found.\n\n Definitions:\n - value: The value to search within.\n - subvalue: The value to search for.\n - position: The 1-based position to start searching from. Negative searches backward from the end. Defaults to 1.\n - occurrence: Which occurrence to find. Defaults to 1.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#instr`,\n args: [\n {name: 'value', type: 'string', description: 'The value to search within.'},\n {name: 'subvalue', type: 'string', description: 'The value to search for.'},\n {name: 'position', type: 'number?', description: 'The 1-based position to start searching from. Negative searches backward from the end. Defaults to 1.'},\n {name: 'occurrence', type: 'number?', description: 'Which occurrence to find. Defaults to 1.'},\n ],\n returns: 'number',\n },\n {\n name: 'left',\n description: trim(`\n LEFT(value, length)\n\n Returns a STRING or BYTES value that consists of the specified number of leftmost characters or bytes from value. If length is 0 or negative, an empty STRING or BYTES value is returned. If length is greater than the length of value, the original value is returned.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#left`,\n args: [\n ['value', 'string'],\n ['length', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'length',\n description: trim(`\n LENGTH(value)\n\n Returns the length of the STRING or BYTES value. The returned value is in characters for STRING arguments and in bytes for the BYTES argument.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#length`,\n args: [['value', 'string']],\n returns: 'number',\n },\n {\n name: 'lower',\n description: trim(`\n LOWER(value)\n\n Returns the original string with all alphabetic characters in lowercase. Mapping between lowercase and uppercase is done according to the Unicode Character Database without taking into account language-specific mappings.\n\n Supported Argument Types: STRING\n Returned Data Types: STRING\n `),\n url: `${bq}/string_functions#lower`,\n args: [['value', 'string']],\n returns: 'string',\n },\n {\n name: 'lpad',\n description: trim(`\n LPAD(original_value, return_length[, pattern])\n\n Returns a STRING or BYTES value that consists of original_value prepended with pattern. The returned value has length return_length. If original_value exceeds return_length, this function truncates original_value to return_length.\n\n Definitions:\n - original_value: The value to pad.\n - return_length: The length of the returned value.\n - pattern: The pattern to use for padding. Defaults to a single space.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#lpad`,\n args: [\n {name: 'original_value', type: 'string', description: 'The value to pad.'},\n {name: 'return_length', type: 'number', description: 'The length of the returned value.'},\n {name: 'pattern', type: 'string?', description: 'The pattern to use for padding. Defaults to a single space.'},\n ],\n returns: 'string',\n },\n {\n name: 'ltrim',\n description: trim(`\n LTRIM(value1[, value2])\n\n Returns a STRING or BYTES value that is the same as value1, but with all leading characters that appear in value2 removed. If value2 is not specified, all leading whitespace characters are removed.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#ltrim`,\n args: [\n {name: 'value', type: 'string'},\n {name: 'characters', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'regexp_contains',\n description: trim(`\n REGEXP_CONTAINS(value, regexp)\n\n Returns TRUE if value is a partial match for the regular expression, regexp.\n\n If the regexp argument is invalid, the function returns an error.\n\n Supported Argument Types: STRING\n Returned Data Types: BOOL\n `),\n url: `${bq}/string_functions#regexp_contains`,\n args: [\n ['value', 'string'],\n ['regexp', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'regexp_extract',\n description: trim(`\n REGEXP_EXTRACT(value, regexp[, position[, occurrence]])\n\n Returns the first substring in value that matches the regular expression, regexp. Returns NULL if there is no match.\n\n If the regular expression contains a capturing group, the function returns the substring that is matched by that capturing group. If the expression does not contain a capturing group, the function returns the entire matching substring.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#regexp_extract`,\n args: [\n {name: 'value', type: 'string'},\n {name: 'regexp', type: 'string'},\n {name: 'position', type: 'number?'},\n {name: 'occurrence', type: 'number?'},\n ],\n returns: 'string',\n },\n {\n name: 'regexp_extract_all',\n description: trim(`\n REGEXP_EXTRACT_ALL(value, regexp)\n\n Returns an array of all substrings of value that match the regular expression, regexp.\n\n Supported Argument Types: STRING\n Returned Data Types: ARRAY<STRING>\n `),\n url: `${bq}/string_functions#regexp_extract_all`,\n args: [\n ['value', 'string'],\n ['regexp', 'string'],\n ],\n returns: 'array',\n },\n {\n name: 'regexp_instr',\n description: trim(`\n REGEXP_INSTR(source_value, regexp[, position[, occurrence[, occurrence_position]]])\n\n Returns the 1-based position of the first occurrence of the regular expression, regexp, in source_value. Returns 0 if no match is found.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#regexp_instr`,\n args: [\n {name: 'source_value', type: 'string'},\n {name: 'regexp', type: 'string'},\n {name: 'position', type: 'number?'},\n {name: 'occurrence', type: 'number?'},\n ],\n returns: 'number',\n },\n {\n name: 'regexp_replace',\n description: trim(`\n REGEXP_REPLACE(value, regexp, replacement)\n\n Returns a STRING where all substrings of value that match the regular expression regexp are replaced with replacement.\n\n You can use backslash-escaped digits (\\\\1 to \\\\9) within the replacement string to insert text matching the corresponding parenthesized group in the regexp pattern.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#regexp_replace`,\n args: [\n ['value', 'string'],\n ['regexp', 'string'],\n ['replacement', 'string'],\n ],\n returns: 'string',\n },\n {\n name: 'repeat',\n description: trim(`\n REPEAT(original_value, repetitions)\n\n Returns a STRING or BYTES value that consists of original_value, repeated. The repetitions parameter specifies the number of times to repeat original_value.\n\n Returns NULL if any input is NULL. Returns an error if repetitions is negative.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#repeat`,\n args: [\n ['original_value', 'string'],\n ['repetitions', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'replace',\n description: trim(`\n REPLACE(original_value, from_expression, to_expression)\n\n Replaces all occurrences of from_expression in original_value with to_expression. Returns NULL if any input is NULL.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#replace`,\n args: [\n ['original_value', 'string'],\n ['from_expression', 'string'],\n ['to_expression', 'string'],\n ],\n returns: 'string',\n },\n {\n name: 'reverse',\n description: trim(`\n REVERSE(value)\n\n Returns the reverse of the input STRING or BYTES.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#reverse`,\n args: [['value', 'string']],\n returns: 'string',\n },\n {\n name: 'right',\n description: trim(`\n RIGHT(value, length)\n\n Returns a STRING or BYTES value that consists of the specified number of rightmost characters or bytes from value. If length is 0 or negative, an empty STRING or BYTES value is returned. If length is greater than the length of value, the original value is returned.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#right`,\n args: [\n ['value', 'string'],\n ['length', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'rpad',\n description: trim(`\n RPAD(original_value, return_length[, pattern])\n\n Returns a STRING or BYTES value that consists of original_value appended with pattern. The returned value has length return_length. If original_value exceeds return_length, this function truncates original_value to return_length.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#rpad`,\n args: [\n {name: 'original_value', type: 'string'},\n {name: 'return_length', type: 'number'},\n {name: 'pattern', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'rtrim',\n description: trim(`\n RTRIM(value1[, value2])\n\n Returns a STRING or BYTES value that is the same as value1, but with all trailing characters that appear in value2 removed. If value2 is not specified, all trailing whitespace characters are removed.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#rtrim`,\n args: [\n ['value', 'string'],\n ['characters', 'string?'],\n ],\n returns: 'string',\n },\n {\n name: 'soundex',\n description: trim(`\n SOUNDEX(value)\n\n Returns a STRING that represents the Soundex code for value.\n\n Supported Argument Types: STRING\n Returned Data Types: STRING\n `),\n url: `${bq}/string_functions#soundex`,\n args: [['value', 'string']],\n returns: 'string',\n },\n {\n name: 'split',\n description: trim(`\n SPLIT(value[, delimiter])\n\n Splits value using the delimiter argument. Returns an ARRAY of STRING or BYTES.\n\n If value is STRING, the default delimiter is a comma. If value is BYTES, you must specify a delimiter.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: ARRAY<STRING> or ARRAY<BYTES>\n `),\n url: `${bq}/string_functions#split`,\n args: [\n {name: 'value', type: 'string', description: 'The STRING or BYTES value to split.'},\n {name: 'delimiter', type: 'string?', description: 'The delimiter to split on. Defaults to comma for STRING.'},\n ],\n returns: 'array',\n },\n {\n name: 'starts_with',\n description: trim(`\n STARTS_WITH(value, prefix)\n\n Takes two STRING or BYTES values. Returns TRUE if prefix is a prefix of value.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: BOOL\n `),\n url: `${bq}/string_functions#starts_with`,\n args: [\n ['value', 'string'],\n ['prefix', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'strpos',\n description: trim(`\n STRPOS(value, subvalue)\n\n Returns the 1-based position of the first occurrence of subvalue inside value. Returns 0 if subvalue is not found.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#strpos`,\n args: [\n ['value', 'string'],\n ['subvalue', 'string'],\n ],\n returns: 'number',\n },\n {\n name: 'substr',\n description: trim(`\n SUBSTR(value, position[, length])\n\n Gets a portion of a STRING or BYTES value, starting from the specified position. If length is specified, gets that many characters or bytes; otherwise gets all remaining.\n\n If position is negative, the function counts from the end of value, with -1 indicating the last character.\n\n If position is 0, the function starts from position 1.\n\n If length is specified and less than 0, the function returns an empty value.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#substr`,\n args: [\n {name: 'value', type: 'string'},\n {name: 'position', type: 'number', description: 'The 1-based starting position. Negative values count from the end.'},\n {name: 'length', type: 'number?', description: 'The number of characters or bytes to return.'},\n ],\n returns: 'string',\n },\n {\n name: 'substring',\n description: trim(`\n SUBSTRING(value, position[, length])\n\n Alias for SUBSTR.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#substring`,\n args: [\n ['value', 'string'],\n ['position', 'number'],\n ['length', 'number?'],\n ],\n returns: 'string',\n },\n {\n name: 'trim',\n description: trim(`\n TRIM(value[, cutset])\n\n Returns a STRING or BYTES value that is the same as value, but with all leading and trailing characters that appear in cutset removed. If cutset is not specified, all leading and trailing whitespace characters are removed.\n\n Supported Argument Types: STRING or BYTES\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/string_functions#trim`,\n args: [\n ['value', 'string'],\n ['cutset', 'string?'],\n ],\n returns: 'string',\n },\n {\n name: 'unicode',\n description: trim(`\n UNICODE(value)\n\n Returns the Unicode code point for the first character in value. Returns 0 if value is empty, or if the resulting Unicode code point is 0.\n\n Supported Argument Types: STRING\n Returned Data Types: INT64\n `),\n url: `${bq}/string_functions#unicode`,\n args: [['value', 'string']],\n returns: 'number',\n },\n {\n name: 'upper',\n description: trim(`\n UPPER(value)\n\n Returns the original string with all alphabetic characters in uppercase. Mapping between lowercase and uppercase is done according to the Unicode Character Database without taking into account language-specific mappings.\n\n Supported Argument Types: STRING\n Returned Data Types: STRING\n `),\n url: `${bq}/string_functions#upper`,\n args: [['value', 'string']],\n returns: 'string',\n },\n\n // ============================================================================\n // Conditional Expressions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/conditional_expressions\n // ============================================================================\n\n {\n name: 'coalesce',\n description: trim(`\n COALESCE(expr[, ...])\n\n Returns the value of the first non-NULL expression. The remaining expressions are not evaluated. An input expression can be any type. There may be multiple input expression types. All input expressions must be implicitly coercible to a common supertype.\n\n Returned Data Types: Supertype of the input types.\n `),\n url: `${bq}/conditional_expressions#coalesce`,\n args: [['values', 'T...']],\n returns: 'T',\n },\n {\n name: 'if',\n description: trim(`\n IF(expr, true_result, else_result)\n\n If expr is TRUE, returns true_result, else returns the result of else_result. else_result is not evaluated if expr is TRUE. true_result is not evaluated if expr is FALSE or NULL.\n\n expr must be a BOOL. true_result and else_result must be coercible to a common supertype.\n\n Returned Data Types: Supertype of true_result and else_result.\n `),\n url: `${bq}/conditional_expressions#if`,\n args: [\n ['condition', 'boolean'],\n ['true_value', 'T'],\n ['false_value', 'T'],\n ],\n returns: 'T',\n },\n {\n name: 'ifnull',\n description: trim(`\n IFNULL(expr, null_result)\n\n If expr is NULL, returns null_result. Otherwise, returns expr. If expr is not NULL, null_result is not evaluated.\n\n expr and null_result can be any type and must be implicitly coercible to a common supertype. Synonym for COALESCE(expr, null_result).\n\n Returned Data Types: Supertype of expr and null_result.\n `),\n url: `${bq}/conditional_expressions#ifnull`,\n args: [\n ['value', 'T'],\n ['default_value', 'T'],\n ],\n returns: 'T',\n },\n {\n name: 'nullif',\n description: trim(`\n NULLIF(expr1, expr2)\n\n Returns NULL if expr1 = expr2 is TRUE, otherwise returns expr1.\n\n expr1 and expr2 must be implicitly coercible to a common supertype, and must be comparable.\n\n Returned Data Types: Supertype of expr1 and expr2.\n `),\n url: `${bq}/conditional_expressions#nullif`,\n args: [\n ['value1', 'T'],\n ['value2', 'T'],\n ],\n returns: 'T',\n },\n\n // ============================================================================\n // Date Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions\n // ============================================================================\n\n {\n name: 'current_date',\n description: trim(`\n CURRENT_DATE([time_zone])\n\n Returns the current date as a DATE value. Parentheses are optional when called with no arguments.\n\n This function supports an optional time_zone parameter. If no time zone is specified, the default time zone, UTC, is used.\n\n Returned Data Types: DATE\n `),\n url: `${bq}/date_functions#current_date`,\n args: [{name: 'time_zone', type: 'string?', description: 'The time zone to use. Defaults to UTC.'}],\n returns: 'date',\n supportsBareInvocation: true,\n },\n {\n name: 'date',\n description: trim(`\n DATE(year, month, day)\n DATE(timestamp_expression[, time_zone])\n DATE(datetime_expression)\n\n Constructs a DATE from INT64 values representing the year, month, and day. Extracts the DATE from a TIMESTAMP or DATETIME expression.\n\n Returned Data Types: DATE\n `),\n url: `${bq}/date_functions#date`,\n args: [\n {name: 'year_or_timestamp', type: 'any', description: 'Year as INT64, or a TIMESTAMP/DATETIME expression.'},\n {name: 'month_or_timezone', type: 'any?', description: 'Month as INT64, or time zone for TIMESTAMP.'},\n {name: 'day', type: 'number?', description: 'Day as INT64.'},\n ],\n returns: 'date',\n },\n {\n name: 'date_add',\n description: trim(`\n DATE_ADD(date_expression, INTERVAL int64_expression date_part)\n\n Adds a specified time interval to a DATE.\n\n DATE_ADD supports the following date_part values: DAY, WEEK, MONTH, QUARTER, YEAR.\n\n Special handling is required for MONTH, QUARTER, and YEAR parts when the date is at (or near) the last day of the month.\n\n Returned Data Types: DATE\n `),\n url: `${bq}/date_functions#date_add`,\n args: [\n {name: 'date_expression', type: 'date'},\n {name: 'interval', type: 'number', description: 'The interval value to add.'},\n ],\n returns: 'date',\n },\n {\n name: 'date_diff',\n description: trim(`\n DATE_DIFF(date_expression_a, date_expression_b, date_part)\n\n Returns the whole number of specified date_part intervals between two DATE values. The first DATE is the later value, the second is the earlier.\n\n DATE_DIFF supports the following date_part values: DAY, WEEK, WEEK(<WEEKDAY>), ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/date_functions#date_diff`,\n args: [\n {name: 'date_a', type: 'date', description: 'The later date.'},\n {name: 'date_b', type: 'date', description: 'The earlier date.'},\n {name: 'date_part', type: 'string', description: 'The date part to use for the difference.'},\n ],\n returns: 'number',\n },\n {\n name: 'date_from_unix_date',\n description: trim(`\n DATE_FROM_UNIX_DATE(int64_expression)\n\n Interprets int64_expression as the number of days since 1970-01-01.\n\n Returned Data Types: DATE\n `),\n url: `${bq}/date_functions#date_from_unix_date`,\n args: [['unix_date', 'number']],\n returns: 'date',\n },\n {\n name: 'date_sub',\n description: trim(`\n DATE_SUB(date_expression, INTERVAL int64_expression date_part)\n\n Subtracts a specified time interval from a DATE.\n\n DATE_SUB supports the following date_part values: DAY, WEEK, MONTH, QUARTER, YEAR.\n\n Special handling is required for MONTH, QUARTER, and YEAR parts when the date is at (or near) the last day of the month.\n\n Returned Data Types: DATE\n `),\n url: `${bq}/date_functions#date_sub`,\n args: [\n {name: 'date_expression', type: 'date'},\n {name: 'interval', type: 'number', description: 'The interval value to subtract.'},\n ],\n returns: 'date',\n },\n {\n name: 'date_trunc',\n description: trim(`\n DATE_TRUNC(date_expression, date_part)\n\n Truncates a DATE or TIMESTAMP value to the granularity of date_part. The value is always rounded to the beginning of date_part.\n\n DATE_TRUNC supports the following values for date_part: DAY, WEEK, WEEK(<WEEKDAY>), ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR.\n\n Returned Data Types: Same as input (DATE or TIMESTAMP)\n `),\n url: `${bq}/date_functions#date_trunc`,\n args: [\n {name: 'date_expression', type: 'T'},\n {name: 'date_part', type: 'kw', description: 'The date part to truncate to.'},\n ],\n returns: 'T',\n metadata: args => inferGrain(args[1]?.sql),\n sqlTemplate: 'DATE_TRUNC(${date_expression}, ${date_part})',\n },\n {\n name: 'format_date',\n description: trim(`\n FORMAT_DATE(format_string, date_expression)\n\n Formats a DATE value according to the specified format_string.\n\n See the supported format elements for DATE.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/date_functions#format_date`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'date_expression', type: 'date'},\n ],\n returns: 'string',\n },\n {\n name: 'last_day',\n description: trim(`\n LAST_DAY(date_expression[, date_part])\n\n Returns the last day from a DATE value that contains the date. This is commonly used to return the last day of the month.\n\n You can optionally specify a date_part for which the last day is returned. If this parameter is not used, the default value is MONTH.\n\n LAST_DAY supports the following values for date_part: YEAR, QUARTER, MONTH, WEEK, WEEK(<WEEKDAY>), ISOWEEK, ISOYEAR.\n\n Returned Data Types: DATE\n `),\n url: `${bq}/date_functions#last_day`,\n args: [\n {name: 'date_expression', type: 'date'},\n {name: 'date_part', type: 'string?', description: 'The date part. Defaults to MONTH.'},\n ],\n returns: 'date',\n },\n {\n name: 'parse_date',\n description: trim(`\n PARSE_DATE(format_string, date_string)\n\n Converts a STRING value to a DATE value.\n\n When using PARSE_DATE, keep the following in mind:\n - Unspecified fields. Any unspecified field is initialized from 1970-01-01.\n - Case insensitivity. Names, such as Monday, February, and so on, are case insensitive.\n - Whitespace. One or more consecutive white spaces in the format string matches zero or more consecutive white spaces in the date string.\n - Format precedence. When two (or more) format elements have overlapping information, the last one generally overrides any earlier ones.\n\n Returned Data Types: DATE\n `),\n url: `${bq}/date_functions#parse_date`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'date_string', type: 'string', description: 'The date string to parse.'},\n ],\n returns: 'date',\n },\n {\n name: 'unix_date',\n description: trim(`\n UNIX_DATE(date_expression)\n\n Returns the number of days since 1970-01-01.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/date_functions#unix_date`,\n args: [['date_expression', 'date']],\n returns: 'number',\n },\n\n // ============================================================================\n // Datetime Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/datetime_functions\n // ============================================================================\n\n {\n name: 'current_datetime',\n description: trim(`\n CURRENT_DATETIME([time_zone])\n\n Returns the current DATETIME value. Parentheses are optional when called with no arguments.\n\n This function supports an optional time_zone parameter. If no time zone is specified, the default time zone, UTC, is used.\n\n Returned Data Types: DATETIME\n `),\n url: `${bq}/datetime_functions#current_datetime`,\n args: [{name: 'time_zone', type: 'string?', description: 'The time zone to use. Defaults to UTC.'}],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n {\n name: 'local_timestamp',\n description: trim(`\n Returns the current local timestamp (DATETIME in BigQuery).\n\n This is a Graphene alias for CURRENT_DATETIME().\n `),\n url: `${bq}/datetime_functions#current_datetime`,\n args: [],\n returns: 'timestamp',\n sqlName: 'CURRENT_DATETIME',\n supportsBareInvocation: true,\n },\n {\n name: 'datetime',\n description: trim(`\n DATETIME(year, month, day, hour, minute, second)\n DATETIME(date_expression[, time_expression])\n DATETIME(timestamp_expression[, time_zone])\n\n Constructs a DATETIME value.\n\n Returned Data Types: DATETIME\n `),\n url: `${bq}/datetime_functions#datetime`,\n args: [\n {name: 'year_or_date_or_timestamp', type: 'any'},\n {name: 'month_or_time_or_timezone', type: 'any?'},\n {name: 'day', type: 'number?'},\n {name: 'hour', type: 'number?'},\n {name: 'minute', type: 'number?'},\n {name: 'second', type: 'number?'},\n ],\n returns: 'datetime',\n },\n {\n name: 'datetime_add',\n description: trim(`\n DATETIME_ADD(datetime_expression, INTERVAL int64_expression part)\n\n Adds int64_expression units of part to the DATETIME value.\n\n DATETIME_ADD supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR.\n\n Returned Data Types: DATETIME\n `),\n url: `${bq}/datetime_functions#datetime_add`,\n args: [\n {name: 'datetime_expression', type: 'datetime'},\n {name: 'interval', type: 'number', description: 'The interval value to add.'},\n ],\n returns: 'datetime',\n },\n {\n name: 'datetime_diff',\n description: trim(`\n DATETIME_DIFF(datetime_expression_a, datetime_expression_b, part)\n\n Returns the whole number of specified part intervals between two DATETIME values. The first DATETIME is the later value, the second is the earlier.\n\n DATETIME_DIFF supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, WEEK(<WEEKDAY>), ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/datetime_functions#datetime_diff`,\n args: [\n {name: 'datetime_a', type: 'datetime', description: 'The later datetime.'},\n {name: 'datetime_b', type: 'datetime', description: 'The earlier datetime.'},\n {name: 'part', type: 'string', description: 'The part to use for the difference.'},\n ],\n returns: 'number',\n },\n {\n name: 'datetime_sub',\n description: trim(`\n DATETIME_SUB(datetime_expression, INTERVAL int64_expression part)\n\n Subtracts int64_expression units of part from the DATETIME value.\n\n DATETIME_SUB supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR.\n\n Returned Data Types: DATETIME\n `),\n url: `${bq}/datetime_functions#datetime_sub`,\n args: [\n {name: 'datetime_expression', type: 'datetime'},\n {name: 'interval', type: 'number', description: 'The interval value to subtract.'},\n ],\n returns: 'datetime',\n },\n {\n name: 'datetime_trunc',\n description: trim(`\n DATETIME_TRUNC(datetime_expression, part)\n\n Truncates a DATETIME value to the granularity of part.\n\n DATETIME_TRUNC supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, WEEK(<WEEKDAY>), ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR.\n\n Returned Data Types: DATETIME\n `),\n url: `${bq}/datetime_functions#datetime_trunc`,\n args: [\n {name: 'datetime_expression', type: 'datetime'},\n {name: 'part', type: 'string', description: 'The part to truncate to.'},\n ],\n returns: 'datetime',\n metadata: args => inferGrain(args[1]?.sql),\n },\n {\n name: 'format_datetime',\n description: trim(`\n FORMAT_DATETIME(format_string, datetime_expression)\n\n Formats a DATETIME value according to the specified format_string.\n\n See the supported format elements for DATETIME.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/datetime_functions#format_datetime`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'datetime_expression', type: 'datetime'},\n ],\n returns: 'string',\n },\n {\n name: 'parse_datetime',\n description: trim(`\n PARSE_DATETIME(format_string, datetime_string)\n\n Converts a STRING value to a DATETIME value.\n\n When using PARSE_DATETIME, keep the following in mind:\n - Unspecified fields. Any unspecified field is initialized from 1970-01-01 00:00:00.\n - Case insensitivity. Names, such as Monday, February, and so on, are case insensitive.\n - Whitespace. One or more consecutive white spaces in the format string matches zero or more consecutive white spaces in the datetime string.\n - Format precedence. When two (or more) format elements have overlapping information, the last one generally overrides any earlier ones.\n\n Returned Data Types: DATETIME\n `),\n url: `${bq}/datetime_functions#parse_datetime`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'datetime_string', type: 'string', description: 'The datetime string to parse.'},\n ],\n returns: 'datetime',\n },\n\n // ============================================================================\n // Time Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/time_functions\n // ============================================================================\n\n {\n name: 'current_time',\n description: trim(`\n CURRENT_TIME([time_zone])\n\n Returns the current TIME value. Parentheses are optional when called with no arguments.\n\n This function supports an optional time_zone parameter. If no time zone is specified, the default time zone, UTC, is used.\n\n Returned Data Types: TIME\n `),\n url: `${bq}/time_functions#current_time`,\n args: [{name: 'time_zone', type: 'string?', description: 'The time zone to use. Defaults to UTC.'}],\n returns: 'timestamp', // Graphene treats TIME as timestamp\n supportsBareInvocation: true,\n },\n {\n name: 'time',\n description: trim(`\n TIME(hour, minute, second)\n TIME(timestamp, [time_zone])\n TIME(datetime)\n\n Constructs a TIME value.\n\n Returned Data Types: TIME\n `),\n url: `${bq}/time_functions#time`,\n args: [\n {name: 'hour_or_timestamp_or_datetime', type: 'any'},\n {name: 'minute_or_timezone', type: 'any?'},\n {name: 'second', type: 'number?'},\n ],\n returns: 'time',\n },\n {\n name: 'time_add',\n description: trim(`\n TIME_ADD(time_expression, INTERVAL int64_expression part)\n\n Adds int64_expression units of part to the TIME value.\n\n TIME_ADD supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR.\n\n This function automatically adjusts when values fall outside the 00:00:00 to 24:00:00 boundary.\n\n Returned Data Types: TIME\n `),\n url: `${bq}/time_functions#time_add`,\n args: [\n {name: 'time_expression', type: 'time'},\n {name: 'interval', type: 'number', description: 'The interval value to add.'},\n ],\n returns: 'time',\n },\n {\n name: 'time_diff',\n description: trim(`\n TIME_DIFF(time_expression_a, time_expression_b, part)\n\n Returns the whole number of specified part intervals between two TIME values. The first TIME is the later value, the second is the earlier.\n\n TIME_DIFF supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/time_functions#time_diff`,\n args: [\n {name: 'time_a', type: 'time', description: 'The later time.'},\n {name: 'time_b', type: 'time', description: 'The earlier time.'},\n {name: 'part', type: 'string', description: 'The part to use for the difference.'},\n ],\n returns: 'number',\n },\n {\n name: 'time_sub',\n description: trim(`\n TIME_SUB(time_expression, INTERVAL int64_expression part)\n\n Subtracts int64_expression units of part from the TIME value.\n\n TIME_SUB supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR.\n\n This function automatically adjusts when values fall outside the 00:00:00 to 24:00:00 boundary.\n\n Returned Data Types: TIME\n `),\n url: `${bq}/time_functions#time_sub`,\n args: [\n {name: 'time_expression', type: 'time'},\n {name: 'interval', type: 'number', description: 'The interval value to subtract.'},\n ],\n returns: 'time',\n },\n {\n name: 'time_trunc',\n description: trim(`\n TIME_TRUNC(time_expression, part)\n\n Truncates a TIME value to the granularity of part.\n\n TIME_TRUNC supports the following values for part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR.\n\n Returned Data Types: TIME\n `),\n url: `${bq}/time_functions#time_trunc`,\n args: [\n {name: 'time_expression', type: 'time'},\n {name: 'part', type: 'string', description: 'The part to truncate to.'},\n ],\n returns: 'time',\n metadata: args => inferGrain(args[1]?.sql),\n },\n {\n name: 'format_time',\n description: trim(`\n FORMAT_TIME(format_string, time_expression)\n\n Formats a TIME value according to the specified format_string.\n\n See the supported format elements for TIME.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/time_functions#format_time`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'time_expression', type: 'time'},\n ],\n returns: 'string',\n },\n {\n name: 'parse_time',\n description: trim(`\n PARSE_TIME(format_string, time_string)\n\n Converts a STRING value to a TIME value.\n\n When using PARSE_TIME, keep the following in mind:\n - Unspecified fields. Any unspecified field is initialized from 00:00:00.0.\n - Whitespace. One or more consecutive white spaces in the format string matches zero or more consecutive white spaces in the time string.\n - Format precedence. When two (or more) format elements have overlapping information, the last one generally overrides any earlier ones.\n\n Returned Data Types: TIME\n `),\n url: `${bq}/time_functions#parse_time`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'time_string', type: 'string', description: 'The time string to parse.'},\n ],\n returns: 'time',\n },\n\n // ============================================================================\n // Timestamp Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/timestamp_functions\n // ============================================================================\n\n {\n name: 'current_timestamp',\n description: trim(`\n CURRENT_TIMESTAMP([time_zone])\n\n Returns the current TIMESTAMP value. Parentheses are optional when called with no arguments.\n\n This function supports an optional time_zone parameter.\n\n This function handles leap seconds by smearing them across a window of 20 hours around the inserted leap second.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#current_timestamp`,\n args: [{name: 'time_zone', type: 'string?', description: 'The time zone to use.'}],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n {\n name: 'timestamp',\n description: trim(`\n TIMESTAMP(string_expression[, time_zone])\n TIMESTAMP(date_expression[, time_zone])\n TIMESTAMP(datetime_expression[, time_zone])\n\n Converts a STRING, DATE, or DATETIME expression to a TIMESTAMP.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#timestamp`,\n args: [\n {name: 'expression', type: 'any', description: 'A STRING, DATE, or DATETIME expression.'},\n {name: 'time_zone', type: 'string?', description: 'The time zone to use.'},\n ],\n returns: 'timestamp',\n },\n {\n name: 'timestamp_add',\n description: trim(`\n TIMESTAMP_ADD(timestamp_expression, INTERVAL int64_expression date_part)\n\n Adds int64_expression units of date_part to the TIMESTAMP value, independent of any time zone.\n\n TIMESTAMP_ADD supports the following values for date_part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#timestamp_add`,\n args: [\n {name: 'timestamp_expression', type: 'timestamp'},\n {name: 'interval', type: 'number', description: 'The interval value to add.'},\n ],\n returns: 'timestamp',\n },\n {\n name: 'timestamp_diff',\n description: trim(`\n TIMESTAMP_DIFF(timestamp_expression_a, timestamp_expression_b, date_part)\n\n Returns the whole number of specified date_part intervals between two TIMESTAMP values. The first TIMESTAMP is the later value, the second is the earlier.\n\n TIMESTAMP_DIFF supports the following values for date_part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/timestamp_functions#timestamp_diff`,\n args: [\n {name: 'timestamp_a', type: 'timestamp', description: 'The later timestamp.'},\n {name: 'timestamp_b', type: 'timestamp', description: 'The earlier timestamp.'},\n {name: 'date_part', type: 'kw', description: 'The date part to use for the difference.'},\n ],\n returns: 'number',\n },\n {\n name: 'timestamp_sub',\n description: trim(`\n TIMESTAMP_SUB(timestamp_expression, INTERVAL int64_expression date_part)\n\n Subtracts int64_expression units of date_part from the TIMESTAMP value, independent of any time zone.\n\n TIMESTAMP_SUB supports the following values for date_part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#timestamp_sub`,\n args: [\n {name: 'timestamp_expression', type: 'timestamp'},\n {name: 'interval', type: 'number', description: 'The interval value to subtract.'},\n ],\n returns: 'timestamp',\n },\n {\n name: 'timestamp_trunc',\n description: trim(`\n TIMESTAMP_TRUNC(timestamp_expression, date_part[, time_zone])\n\n Truncates a TIMESTAMP value to the granularity of date_part.\n\n TIMESTAMP_TRUNC supports the following values for date_part: MICROSECOND, MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, WEEK(<WEEKDAY>), ISOWEEK, MONTH, QUARTER, YEAR, ISOYEAR.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#timestamp_trunc`,\n args: [\n {name: 'timestamp_expression', type: 'timestamp'},\n {name: 'date_part', type: 'string', description: 'The date part to truncate to.'},\n {name: 'time_zone', type: 'string?', description: 'The time zone to use.'},\n ],\n returns: 'timestamp',\n metadata: args => inferGrain(args[1]?.sql),\n },\n {\n name: 'format_timestamp',\n description: trim(`\n FORMAT_TIMESTAMP(format_string, timestamp_expression[, time_zone])\n\n Formats a TIMESTAMP value according to the specified format_string.\n\n See the supported format elements for TIMESTAMP.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/timestamp_functions#format_timestamp`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'timestamp_expression', type: 'timestamp'},\n {name: 'time_zone', type: 'string?', description: 'The time zone to use.'},\n ],\n returns: 'string',\n },\n {\n name: 'parse_timestamp',\n description: trim(`\n PARSE_TIMESTAMP(format_string, timestamp_string[, time_zone])\n\n Converts a STRING value to a TIMESTAMP value.\n\n When using PARSE_TIMESTAMP, keep the following in mind:\n - Unspecified fields. Any unspecified field is initialized from 1970-01-01 00:00:00.0 UTC.\n - Case insensitivity. Names, such as Monday, February, and so on, are case insensitive.\n - Whitespace. One or more consecutive white spaces in the format string matches zero or more consecutive white spaces in the timestamp string.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#parse_timestamp`,\n args: [\n {name: 'format_string', type: 'string', description: 'The format string.'},\n {name: 'timestamp_string', type: 'string', description: 'The timestamp string to parse.'},\n {name: 'time_zone', type: 'string?', description: 'The time zone to use.'},\n ],\n returns: 'timestamp',\n },\n {\n name: 'timestamp_micros',\n description: trim(`\n TIMESTAMP_MICROS(int64_expression)\n\n Interprets int64_expression as the number of microseconds since 1970-01-01 00:00:00 UTC and returns a TIMESTAMP.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#timestamp_micros`,\n args: [['microseconds', 'number']],\n returns: 'timestamp',\n },\n {\n name: 'timestamp_millis',\n description: trim(`\n TIMESTAMP_MILLIS(int64_expression)\n\n Interprets int64_expression as the number of milliseconds since 1970-01-01 00:00:00 UTC and returns a TIMESTAMP.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#timestamp_millis`,\n args: [['milliseconds', 'number']],\n returns: 'timestamp',\n },\n {\n name: 'timestamp_seconds',\n description: trim(`\n TIMESTAMP_SECONDS(int64_expression)\n\n Interprets int64_expression as the number of seconds since 1970-01-01 00:00:00 UTC and returns a TIMESTAMP.\n\n Returned Data Types: TIMESTAMP\n `),\n url: `${bq}/timestamp_functions#timestamp_seconds`,\n args: [['seconds', 'number']],\n returns: 'timestamp',\n },\n {\n name: 'unix_micros',\n description: trim(`\n UNIX_MICROS(timestamp_expression)\n\n Returns the number of microseconds since 1970-01-01 00:00:00 UTC.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/timestamp_functions#unix_micros`,\n args: [['timestamp_expression', 'timestamp']],\n returns: 'number',\n },\n {\n name: 'unix_millis',\n description: trim(`\n UNIX_MILLIS(timestamp_expression)\n\n Returns the number of milliseconds since 1970-01-01 00:00:00 UTC. Truncates higher levels of precision by rounding down to the beginning of the millisecond.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/timestamp_functions#unix_millis`,\n args: [['timestamp_expression', 'timestamp']],\n returns: 'number',\n },\n {\n name: 'unix_seconds',\n description: trim(`\n UNIX_SECONDS(timestamp_expression)\n\n Returns the number of seconds since 1970-01-01 00:00:00 UTC. Truncates higher levels of precision by rounding down to the beginning of the second.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/timestamp_functions#unix_seconds`,\n args: [['timestamp_expression', 'timestamp']],\n returns: 'number',\n },\n\n // ============================================================================\n // Interval Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/interval_functions\n // ============================================================================\n\n {\n name: 'make_interval',\n description: trim(`\n MAKE_INTERVAL([year][, month][, day][, hour][, minute][, second])\n\n Constructs an INTERVAL value.\n\n All arguments are optional with default value of 0. The resulting INTERVAL represents (year * 12 + month) months, (day * 24 + hour) hours, and (minute * 60 + second) seconds.\n\n Returned Data Types: INTERVAL\n `),\n url: `${bq}/interval_functions#make_interval`,\n args: [\n {name: 'year', type: 'number?', description: 'Number of years.'},\n {name: 'month', type: 'number?', description: 'Number of months.'},\n {name: 'day', type: 'number?', description: 'Number of days.'},\n {name: 'hour', type: 'number?', description: 'Number of hours.'},\n {name: 'minute', type: 'number?', description: 'Number of minutes.'},\n {name: 'second', type: 'number?', description: 'Number of seconds.'},\n ],\n returns: 'interval',\n },\n {\n name: 'justify_days',\n description: trim(`\n JUSTIFY_DAYS(interval_expression)\n\n Normalizes the day part of the interval to the range of -29 to 29 by incrementing/decrementing the month or year part of the interval.\n\n Returned Data Types: INTERVAL\n `),\n url: `${bq}/interval_functions#justify_days`,\n args: [['interval_expression', 'interval']],\n returns: 'interval',\n },\n {\n name: 'justify_hours',\n description: trim(`\n JUSTIFY_HOURS(interval_expression)\n\n Normalizes the time part of the interval to the range of -23:59:59.999999 to 23:59:59.999999 by incrementing/decrementing the day part of the interval.\n\n Returned Data Types: INTERVAL\n `),\n url: `${bq}/interval_functions#justify_hours`,\n args: [['interval_expression', 'interval']],\n returns: 'interval',\n },\n {\n name: 'justify_interval',\n description: trim(`\n JUSTIFY_INTERVAL(interval_expression)\n\n Normalizes the days and time parts of the interval.\n\n Returned Data Types: INTERVAL\n `),\n url: `${bq}/interval_functions#justify_interval`,\n args: [['interval_expression', 'interval']],\n returns: 'interval',\n },\n\n // ============================================================================\n // Array Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions\n // ============================================================================\n\n {\n name: 'array_concat',\n description: trim(`\n ARRAY_CONCAT(array_expression[, ...])\n\n Concatenates one or more arrays with the same element type into a single array. Returns NULL if any input argument is NULL.\n\n Returned Data Types: ARRAY\n `),\n url: `${bq}/array_functions#array_concat`,\n args: [['arrays', 'array...']],\n returns: 'array',\n },\n {\n name: 'array_first',\n description: trim(`\n ARRAY_FIRST(array_expression)\n\n Returns the first element of an array. If the input is an empty array, raises an error. To get NULL for an empty array instead, use ARRAY_FIRST_SAFE.\n\n Returned Data Types: Matches the element type of the array.\n `),\n url: `${bq}/array_functions#array_first`,\n args: [['array_expression', 'array']],\n returns: 'T',\n },\n {\n name: 'array_last',\n description: trim(`\n ARRAY_LAST(array_expression)\n\n Returns the last element of an array. If the input is an empty array, raises an error. To get NULL for an empty array instead, use ARRAY_LAST_SAFE.\n\n Returned Data Types: Matches the element type of the array.\n `),\n url: `${bq}/array_functions#array_last`,\n args: [['array_expression', 'array']],\n returns: 'T',\n },\n {\n name: 'array_length',\n description: trim(`\n ARRAY_LENGTH(array_expression)\n\n Returns the number of elements in an array. Returns 0 for an empty array. Returns NULL if array_expression is NULL.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/array_functions#array_length`,\n args: [['array_expression', 'array']],\n returns: 'number',\n },\n {\n name: 'array_reverse',\n description: trim(`\n ARRAY_REVERSE(array_expression)\n\n Returns the input array with its elements in reverse order.\n\n Returned Data Types: ARRAY\n `),\n url: `${bq}/array_functions#array_reverse`,\n args: [['array_expression', 'array']],\n returns: 'array',\n },\n {\n name: 'array_slice',\n description: trim(`\n ARRAY_SLICE(array_to_slice, start_offset, end_offset)\n\n Returns an array containing zero or more consecutive elements from the input array.\n\n Definitions:\n - array_to_slice: The array that contains the elements to return.\n - start_offset: The 0-based inclusive starting offset for elements to return.\n - end_offset: The 0-based exclusive ending offset for elements to return.\n\n Returned Data Types: ARRAY\n `),\n url: `${bq}/array_functions#array_slice`,\n args: [\n {name: 'array_to_slice', type: 'array', description: 'The array to slice.'},\n {name: 'start_offset', type: 'number', description: 'The 0-based inclusive starting offset.'},\n {name: 'end_offset', type: 'number', description: 'The 0-based exclusive ending offset.'},\n ],\n returns: 'array',\n },\n {\n name: 'array_to_string',\n description: trim(`\n ARRAY_TO_STRING(array_expression, delimiter[, null_text])\n\n Returns a concatenation of the elements in array_expression as a STRING. The value for array_expression can either be an array of STRING or BYTES data types.\n\n If the null_text parameter is used, the function replaces any NULL values in the array with the value of null_text. If null_text is not specified, NULL values are omitted.\n\n Returned Data Types: STRING or BYTES\n `),\n url: `${bq}/array_functions#array_to_string`,\n args: [\n {name: 'array_expression', type: 'array'},\n {name: 'delimiter', type: 'string'},\n {name: 'null_text', type: 'string?', description: 'Text to use for NULL values.'},\n ],\n returns: 'string',\n },\n {\n name: 'generate_array',\n description: trim(`\n GENERATE_ARRAY(start_expression, end_expression[, step_expression])\n\n Returns an array of values. The start_expression and end_expression parameters determine the inclusive start and end of the array.\n\n The step_expression parameter determines the increment used to generate array values. The default value is 1 for INT64, NUMERIC, BIGNUMERIC, and FLOAT64 types.\n\n Returned Data Types: ARRAY\n `),\n url: `${bq}/array_functions#generate_array`,\n args: [\n {name: 'start_expression', type: 'number', description: 'The inclusive start value.'},\n {name: 'end_expression', type: 'number', description: 'The inclusive end value.'},\n {name: 'step_expression', type: 'number?', description: 'The increment. Defaults to 1.'},\n ],\n returns: 'array',\n },\n {\n name: 'generate_date_array',\n description: trim(`\n GENERATE_DATE_ARRAY(start_date, end_date[, INTERVAL int64_expression date_part])\n\n Returns an array of dates. The start_date and end_date parameters determine the inclusive start and end of the array.\n\n The optional INTERVAL clause is used to specify a step. The default is 1 DAY.\n\n Returned Data Types: ARRAY<DATE>\n `),\n url: `${bq}/array_functions#generate_date_array`,\n args: [\n {name: 'start_date', type: 'date', description: 'The inclusive start date.'},\n {name: 'end_date', type: 'date', description: 'The inclusive end date.'},\n {name: 'step', type: 'number?', description: 'The interval step. Defaults to 1 DAY.'},\n ],\n returns: 'array',\n },\n {\n name: 'generate_timestamp_array',\n description: trim(`\n GENERATE_TIMESTAMP_ARRAY(start_timestamp, end_timestamp, INTERVAL step_expression date_part)\n\n Returns an ARRAY of TIMESTAMPs separated by a given interval. The start_timestamp and end_timestamp parameters determine the inclusive lower and upper bounds of the ARRAY.\n\n Returned Data Types: ARRAY<TIMESTAMP>\n `),\n url: `${bq}/array_functions#generate_timestamp_array`,\n args: [\n {name: 'start_timestamp', type: 'timestamp', description: 'The inclusive start timestamp.'},\n {name: 'end_timestamp', type: 'timestamp', description: 'The inclusive end timestamp.'},\n {name: 'step', type: 'number', description: 'The interval step.'},\n ],\n returns: 'array',\n },\n\n // ============================================================================\n // JSON Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions\n // ============================================================================\n\n {\n name: 'json_extract',\n description: trim(`\n JSON_EXTRACT(json_string_expr, json_path)\n JSON_EXTRACT(json_expr, json_path)\n\n Extracts a JSON value and converts it to a SQL JSON-formatted STRING or JSON value. This function uses single quotes and brackets to escape invalid JSONPath characters in JSON keys.\n\n Arguments:\n - json_string_expr: A JSON-formatted string.\n - json_expr: JSON. For example, JSON '{\"class\": {\"students\": [{\"name\": \"Jane\"}]}}'.\n - json_path: The JSONPath. This identifies the data that you want to obtain from the input.\n\n Returned Data Types: JSON-formatted STRING or JSON\n `),\n url: `${bq}/json_functions#json_extract`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string', description: 'The JSONPath to extract.'},\n ],\n returns: 'json',\n },\n {\n name: 'json_extract_array',\n description: trim(`\n JSON_EXTRACT_ARRAY(json_string_expr[, json_path])\n JSON_EXTRACT_ARRAY(json_expr[, json_path])\n\n Extracts a JSON array and converts it to a SQL ARRAY<JSON-formatted STRING> or ARRAY<JSON> value. This function uses single quotes and brackets to escape invalid JSONPath characters in JSON keys.\n\n Returned Data Types: ARRAY<JSON-formatted STRING> or ARRAY<JSON>\n `),\n url: `${bq}/json_functions#json_extract_array`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string?', description: 'The JSONPath to extract.'},\n ],\n returns: 'array',\n },\n {\n name: 'json_extract_scalar',\n description: trim(`\n JSON_EXTRACT_SCALAR(json_string_expr[, json_path])\n JSON_EXTRACT_SCALAR(json_expr[, json_path])\n\n Extracts a JSON scalar value and converts it to a SQL STRING value. This function uses single quotes and brackets to escape invalid JSONPath characters in JSON keys.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/json_functions#json_extract_scalar`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string?', description: 'The JSONPath to extract.'},\n ],\n returns: 'string',\n },\n {\n name: 'json_extract_string_array',\n description: trim(`\n JSON_EXTRACT_STRING_ARRAY(json_string_expr[, json_path])\n JSON_EXTRACT_STRING_ARRAY(json_expr[, json_path])\n\n Extracts a JSON array of scalar values and converts it to a SQL ARRAY<STRING> value. This function uses single quotes and brackets to escape invalid JSONPath characters in JSON keys.\n\n Returned Data Types: ARRAY<STRING>\n `),\n url: `${bq}/json_functions#json_extract_string_array`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string?', description: 'The JSONPath to extract.'},\n ],\n returns: 'array',\n },\n {\n name: 'json_query',\n description: trim(`\n JSON_QUERY(json_string_expr, json_path)\n JSON_QUERY(json_expr, json_path)\n\n Extracts a JSON value and converts it to a SQL JSON-formatted STRING or JSON value. This function uses double quotes to escape invalid JSONPath characters in JSON keys.\n\n Returned Data Types: JSON-formatted STRING or JSON\n `),\n url: `${bq}/json_functions#json_query`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string', description: 'The JSONPath to query.'},\n ],\n returns: 'json',\n },\n {\n name: 'json_query_array',\n description: trim(`\n JSON_QUERY_ARRAY(json_string_expr[, json_path])\n JSON_QUERY_ARRAY(json_expr[, json_path])\n\n Extracts a JSON array and converts it to a SQL ARRAY<JSON-formatted STRING> or ARRAY<JSON> value. This function uses double quotes to escape invalid JSONPath characters in JSON keys.\n\n Returned Data Types: ARRAY<JSON-formatted STRING> or ARRAY<JSON>\n `),\n url: `${bq}/json_functions#json_query_array`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string?', description: 'The JSONPath to query.'},\n ],\n returns: 'array',\n },\n {\n name: 'json_value',\n description: trim(`\n JSON_VALUE(json_string_expr[, json_path])\n JSON_VALUE(json_expr[, json_path])\n\n Extracts a JSON scalar value and converts it to a SQL STRING value. This function uses double quotes to escape invalid JSONPath characters in JSON keys.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/json_functions#json_value`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string?', description: 'The JSONPath to query.'},\n ],\n returns: 'string',\n },\n {\n name: 'json_value_array',\n description: trim(`\n JSON_VALUE_ARRAY(json_string_expr[, json_path])\n JSON_VALUE_ARRAY(json_expr[, json_path])\n\n Extracts a JSON array of scalar values and converts it to a SQL ARRAY<STRING> value. This function uses double quotes to escape invalid JSONPath characters in JSON keys.\n\n Returned Data Types: ARRAY<STRING>\n `),\n url: `${bq}/json_functions#json_value_array`,\n args: [\n {name: 'json_expr', type: 'any', description: 'A JSON value or JSON-formatted string.'},\n {name: 'json_path', type: 'string?', description: 'The JSONPath to query.'},\n ],\n returns: 'array',\n },\n {\n name: 'parse_json',\n description: trim(`\n PARSE_JSON(json_string_expr[, wide_number_mode=>{ 'exact' | 'round' }])\n\n Converts a JSON-formatted STRING value to a JSON value.\n\n Arguments:\n - json_string_expr: A JSON-formatted string.\n - wide_number_mode: Determines how to handle numbers that cannot be stored in a JSON value without the loss of precision. 'exact' (default) produces an error if a number cannot be stored without loss of precision. 'round' rounds the number to the nearest representable value.\n\n Returned Data Types: JSON\n `),\n url: `${bq}/json_functions#parse_json`,\n args: [\n {name: 'json_string_expr', type: 'string', description: 'A JSON-formatted string.'},\n {name: 'wide_number_mode', type: 'string?', description: \"How to handle wide numbers: 'exact' (default) or 'round'.\"},\n ],\n returns: 'json',\n },\n {\n name: 'to_json',\n description: trim(`\n TO_JSON(sql_value[, stringify_wide_numbers=>{ TRUE | FALSE }])\n\n Converts a SQL value to a JSON value.\n\n Arguments:\n - sql_value: The SQL value to convert.\n - stringify_wide_numbers: If TRUE, numeric values that cannot be stored without loss of precision are converted to strings. Defaults to FALSE.\n\n Returned Data Types: JSON\n `),\n url: `${bq}/json_functions#to_json`,\n args: [\n {name: 'sql_value', type: 'any', description: 'The SQL value to convert.'},\n {name: 'stringify_wide_numbers', type: 'boolean?', description: 'If TRUE, converts wide numbers to strings.'},\n ],\n returns: 'json',\n },\n {\n name: 'to_json_string',\n description: trim(`\n TO_JSON_STRING(value[, pretty_print])\n\n Converts a SQL value to a JSON-formatted STRING value.\n\n Arguments:\n - value: The value to convert.\n - pretty_print: If TRUE, the returned value is formatted for easy readability.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/json_functions#to_json_string`,\n args: [\n {name: 'value', type: 'any', description: 'The value to convert.'},\n {name: 'pretty_print', type: 'boolean?', description: 'If TRUE, formats for readability.'},\n ],\n returns: 'string',\n },\n {\n name: 'json_type',\n description: trim(`\n JSON_TYPE(json_expr)\n\n Returns the type of the outermost JSON value as a STRING.\n\n The returned STRING can be one of: 'null', 'boolean', 'number', 'string', 'array', 'object'.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/json_functions#json_type`,\n args: [['json_expr', 'json']],\n returns: 'string',\n },\n {\n name: 'json_array',\n description: trim(`\n JSON_ARRAY([value[, ...]])\n\n Creates a JSON array from zero or more SQL values.\n\n Arguments:\n - value: A SQL value. Can be a JSON value.\n\n Returned Data Types: JSON\n `),\n url: `${bq}/json_functions#json_array`,\n args: [['values', 'any...']],\n returns: 'json',\n },\n {\n name: 'json_object',\n description: trim(`\n JSON_OBJECT([key, value[, ...]])\n\n Creates a JSON object from zero or more key-value pairs. Each key must be a SQL STRING and each value can be any SQL data type.\n\n Returned Data Types: JSON\n `),\n url: `${bq}/json_functions#json_object`,\n args: [['key_value_pairs', 'any...']],\n returns: 'json',\n },\n {\n name: 'json_keys',\n description: trim(`\n JSON_KEYS(json_expr[, max_depth])\n\n Returns the keys of a JSON object as an ARRAY<STRING>.\n\n Arguments:\n - json_expr: JSON expression.\n - max_depth: An optional INT64 that represents the maximum depth to search.\n\n Returned Data Types: ARRAY<STRING>\n `),\n url: `${bq}/json_functions#json_keys`,\n args: [\n {name: 'json_expr', type: 'json'},\n {name: 'max_depth', type: 'number?', description: 'Maximum depth to search.'},\n ],\n returns: 'array',\n },\n {\n name: 'json_set',\n description: trim(`\n JSON_SET(json_expr, json_path, value[, json_path, value[, ...]][, create_if_missing=>{ TRUE | FALSE }])\n\n Produces a new JSON value by inserting or replacing a value in a JSON value.\n\n Arguments:\n - json_expr: A JSON expression.\n - json_path: The path to insert/replace the value.\n - value: The value to insert.\n - create_if_missing: If TRUE (default), creates the path if it doesn't exist.\n\n Returned Data Types: JSON\n `),\n url: `${bq}/json_functions#json_set`,\n args: [\n {name: 'json_expr', type: 'json'},\n {name: 'json_path', type: 'string'},\n {name: 'value', type: 'any'},\n ],\n returns: 'json',\n },\n {\n name: 'json_remove',\n description: trim(`\n JSON_REMOVE(json_expr, json_path[, ...])\n\n Produces a new JSON value by removing paths from a JSON value.\n\n Arguments:\n - json_expr: A JSON expression.\n - json_path: One or more paths to remove.\n\n Returned Data Types: JSON\n `),\n url: `${bq}/json_functions#json_remove`,\n args: [\n {name: 'json_expr', type: 'json'},\n {name: 'json_paths', type: 'string...'},\n ],\n returns: 'json',\n },\n {\n name: 'json_strip_nulls',\n description: trim(`\n JSON_STRIP_NULLS(json_expr[, json_path][, include_arrays=>{ TRUE | FALSE }][, remove_empty=>{ TRUE | FALSE }])\n\n Removes JSON null values from a JSON value.\n\n Arguments:\n - json_expr: A JSON expression.\n - json_path: Optionally, a JSONPath to start from.\n - include_arrays: If TRUE, removes nulls from arrays too. Defaults to FALSE.\n - remove_empty: If TRUE, removes empty containers. Defaults to FALSE.\n\n Returned Data Types: JSON\n `),\n url: `${bq}/json_functions#json_strip_nulls`,\n args: [\n {name: 'json_expr', type: 'json'},\n {name: 'json_path', type: 'string?'},\n ],\n returns: 'json',\n },\n\n // ============================================================================\n // Hash Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/hash_functions\n // ============================================================================\n\n {\n name: 'farm_fingerprint',\n description: trim(`\n FARM_FINGERPRINT(value)\n\n Computes the fingerprint of the STRING or BYTES input using the Fingerprint64 function from the open-source FarmHash library. The output of this function for a particular input will never change.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/hash_functions#farm_fingerprint`,\n args: [['value', 'string']],\n returns: 'number',\n },\n {\n name: 'md5',\n description: trim(`\n MD5(input)\n\n Computes the hash of the input using the MD5 algorithm. The input can be either STRING or BYTES. The string version treats the input as an array of bytes.\n\n This function returns 16 bytes.\n\n Returned Data Types: BYTES\n `),\n url: `${bq}/hash_functions#md5`,\n args: [['input', 'string']],\n returns: 'bytes',\n },\n {\n name: 'sha1',\n description: trim(`\n SHA1(input)\n\n Computes the hash of the input using the SHA-1 algorithm. The input can be either STRING or BYTES. The string version treats the input as an array of bytes.\n\n This function returns 20 bytes.\n\n Returned Data Types: BYTES\n `),\n url: `${bq}/hash_functions#sha1`,\n args: [['input', 'string']],\n returns: 'bytes',\n },\n {\n name: 'sha256',\n description: trim(`\n SHA256(input)\n\n Computes the hash of the input using the SHA-256 algorithm. The input can be either STRING or BYTES. The string version treats the input as an array of bytes.\n\n This function returns 32 bytes.\n\n Returned Data Types: BYTES\n `),\n url: `${bq}/hash_functions#sha256`,\n args: [['input', 'string']],\n returns: 'bytes',\n },\n {\n name: 'sha512',\n description: trim(`\n SHA512(input)\n\n Computes the hash of the input using the SHA-512 algorithm. The input can be either STRING or BYTES. The string version treats the input as an array of bytes.\n\n This function returns 64 bytes.\n\n Returned Data Types: BYTES\n `),\n url: `${bq}/hash_functions#sha512`,\n args: [['input', 'string']],\n returns: 'bytes',\n },\n\n // ============================================================================\n // Statistical Aggregate Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/statistical_aggregate_functions\n // ============================================================================\n\n {\n name: 'corr',\n description: trim(`\n CORR(X, Y)\n\n Returns the Pearson coefficient of correlation of a set of number pairs. For each number pair, the first number is the dependent variable and the second number is the independent variable. The return result is between -1 and 1.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#corr`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'covar_pop',\n description: trim(`\n COVAR_POP(X, Y)\n\n Returns the population covariance of a set of number pairs. The first number is the dependent variable; the second number is the independent variable.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#covar_pop`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'covar_samp',\n description: trim(`\n COVAR_SAMP(X, Y)\n\n Returns the sample covariance of a set of number pairs. The first number is the dependent variable; the second number is the independent variable.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#covar_samp`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'stddev',\n description: trim(`\n STDDEV([DISTINCT] expression)\n\n An alias for STDDEV_SAMP. Returns the sample (n-1) standard deviation of the values.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#stddev`,\n args: [['expression', 'number']],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'stddev_pop',\n description: trim(`\n STDDEV_POP([DISTINCT] expression)\n\n Returns the population (n) standard deviation of the values.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#stddev_pop`,\n args: [['expression', 'number']],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'stddev_samp',\n description: trim(`\n STDDEV_SAMP([DISTINCT] expression)\n\n Returns the sample (n-1) standard deviation of the values.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#stddev_samp`,\n args: [['expression', 'number']],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'var_pop',\n description: trim(`\n VAR_POP([DISTINCT] expression)\n\n Returns the population (n) variance of the values.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#var_pop`,\n args: [['expression', 'number']],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'var_samp',\n description: trim(`\n VAR_SAMP([DISTINCT] expression)\n\n Returns the sample (n-1) variance of the values.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#var_samp`,\n args: [['expression', 'number']],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'variance',\n description: trim(`\n VARIANCE([DISTINCT] expression)\n\n An alias for VAR_SAMP. Returns the sample (n-1) variance of the values.\n\n Returned Data Types: FLOAT64\n `),\n url: `${bq}/statistical_aggregate_functions#variance`,\n args: [['expression', 'number']],\n returns: 'number',\n aggregate: true,\n },\n\n // ============================================================================\n // Approximate Aggregate Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/approximate_aggregate_functions\n // ============================================================================\n\n {\n name: 'approx_count_distinct',\n description: trim(`\n APPROX_COUNT_DISTINCT(expression)\n\n Returns the approximate result for COUNT(DISTINCT expression). The value returned is a statistical estimate, not necessarily the actual value.\n\n This function is less accurate than COUNT(DISTINCT expression), but performs better on huge input.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/approximate_aggregate_functions#approx_count_distinct`,\n args: [['expression', 'any']],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'approx_quantiles',\n description: trim(`\n APPROX_QUANTILES([DISTINCT] expression, number [{IGNORE | RESPECT} NULLS])\n\n Returns the approximate boundaries for a group of expression values, where number represents the number of quantiles to create. This function returns an array of number + 1 elements, sorted in ascending order.\n\n Returned Data Types: ARRAY\n `),\n url: `${bq}/approximate_aggregate_functions#approx_quantiles`,\n args: [\n {name: 'expression', type: 'any', description: 'The expression to compute quantiles for.'},\n {name: 'number', type: 'number', description: 'The number of quantiles to create.'},\n ],\n returns: 'array',\n aggregate: true,\n },\n {\n name: 'approx_top_count',\n description: trim(`\n APPROX_TOP_COUNT(expression, number)\n\n Returns the approximate top elements of expression as an array of STRUCTs. The number parameter specifies the number of elements returned.\n\n Each STRUCT contains two fields. The first field (named value) contains an input value. The second field (named count) contains an INT64 specifying the number of times the value was returned.\n\n Returned Data Types: ARRAY<STRUCT>\n `),\n url: `${bq}/approximate_aggregate_functions#approx_top_count`,\n args: [\n {name: 'expression', type: 'any', description: 'The expression to find top values for.'},\n {name: 'number', type: 'number', description: 'The number of top elements to return.'},\n ],\n returns: 'array',\n aggregate: true,\n },\n {\n name: 'approx_top_sum',\n description: trim(`\n APPROX_TOP_SUM(expression, weight, number)\n\n Returns the approximate top elements of expression, based on the sum of an assigned weight. The number parameter specifies the number of elements returned.\n\n Each STRUCT contains two fields: the first field (named value) contains an input value. The second field (named sum) contains an INT64 for the sum of the values of weight associated with value.\n\n Returned Data Types: ARRAY<STRUCT>\n `),\n url: `${bq}/approximate_aggregate_functions#approx_top_sum`,\n args: [\n {name: 'expression', type: 'any', description: 'The expression to find top values for.'},\n {name: 'weight', type: 'number', description: 'The weight to sum.'},\n {name: 'number', type: 'number', description: 'The number of top elements to return.'},\n ],\n returns: 'array',\n aggregate: true,\n },\n\n // ============================================================================\n // Bit Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/bit_functions\n // ============================================================================\n\n {\n name: 'bit_count',\n description: trim(`\n BIT_COUNT(expression)\n\n Returns the number of bits that are set in the input expression. For signed integers, this is the number of bits in two's-complement form.\n\n Returned Data Types: INT64\n `),\n url: `${bq}/bit_functions#bit_count`,\n args: [['expression', 'any']],\n returns: 'number',\n },\n\n // ============================================================================\n // Conversion Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/conversion_functions\n // ============================================================================\n\n // Note: CAST and SAFE_CAST are SQL keywords, not functions, so they are handled specially\n // and not included here.\n {\n name: 'parse_numeric',\n description: trim(`\n PARSE_NUMERIC(string_expression)\n\n Converts a STRING value to a NUMERIC value.\n\n The numeric literal in the string can be optionally enclosed with quotes. If enclosed, the NUMERIC value can include a space before or after the enclosing quotes.\n\n Returned Data Types: NUMERIC\n `),\n url: `${bq}/conversion_functions#parse_numeric`,\n args: [['string_expression', 'string']],\n returns: 'number',\n },\n {\n name: 'parse_bignumeric',\n description: trim(`\n PARSE_BIGNUMERIC(string_expression)\n\n Converts a STRING value to a BIGNUMERIC value.\n\n The numeric literal in the string can be optionally enclosed with quotes. If enclosed, the BIGNUMERIC value can include a space before or after the enclosing quotes.\n\n Returned Data Types: BIGNUMERIC\n `),\n url: `${bq}/conversion_functions#parse_bignumeric`,\n args: [['string_expression', 'string']],\n returns: 'number',\n },\n\n // ============================================================================\n // Utility Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/utility-functions\n // ============================================================================\n\n {\n name: 'generate_uuid',\n description: trim(`\n GENERATE_UUID()\n\n Returns a random universally unique identifier (UUID) as a STRING. The returned UUID is a version 4 UUID.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/utility-functions#generate_uuid`,\n args: [],\n returns: 'string',\n },\n {\n name: 'typeof',\n description: trim(`\n TYPEOF(expression)\n\n Returns the name of the data type of the expression, as a STRING.\n\n Returned Data Types: STRING\n `),\n url: `${bq}/utility-functions#typeof`,\n args: [['expression', 'any']],\n returns: 'string',\n },\n\n // ============================================================================\n // Debugging Functions\n // https://cloud.google.com/bigquery/docs/reference/standard-sql/debugging_functions\n // ============================================================================\n\n {\n name: 'error',\n description: trim(`\n ERROR(error_message)\n\n Produces an error with the given error_message. ERROR is used for conditional error handling.\n\n Returned Data Types: Never returns (always produces an error)\n `),\n url: `${bq}/debugging_functions#error`,\n args: [['error_message', 'string']],\n returns: 'never',\n },\n]\n", "import type {FunctionDef} from './functionTypes.ts'\n\nimport {inferTimeOrdinal, inferGrain} from './temporalMetadata.ts'\nimport {trimIndentation} from './util.ts'\n\nconst trim = trimIndentation\nconst click = 'https://clickhouse.com/docs/en/sql-reference'\n\n// Keep the ClickHouse surface focused on mainstream analytics functions that map\n// cleanly to Graphene's type system and SQL lowering.\nexport const clickHouseFunctions: FunctionDef[] = [\n // ============================================================================\n // Window Functions\n // ============================================================================\n {\n name: 'row_number',\n description: trim(`\n row_number()\n\n Numbers the current row within its window partition.\n `),\n url: `${click}/window-functions/row_number`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'rank',\n description: trim(`\n rank()\n\n Returns the rank of the current row with gaps for ties.\n `),\n url: `${click}/window-functions/rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'dense_rank',\n description: trim(`\n dense_rank()\n\n Returns the rank of the current row without gaps for ties.\n `),\n url: `${click}/window-functions/dense_rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'percent_rank',\n description: trim(`\n percent_rank()\n\n Returns the relative rank of the current row in the partition.\n `),\n url: `${click}/window-functions`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'lag',\n description: trim(`\n lag(expr, offset, default)\n\n Returns a previous value from the window partition.\n `),\n url: `${click}/window-functions/lag`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'lead',\n description: trim(`\n lead(expr, offset, default)\n\n Returns a following value from the window partition.\n `),\n url: `${click}/window-functions/lead`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'first_value',\n description: trim(`\n first_value(expr)\n\n Returns the first value in the window frame.\n `),\n url: `${click}/window-functions/first_value`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'last_value',\n description: trim(`\n last_value(expr)\n\n Returns the last value in the window frame.\n `),\n url: `${click}/window-functions/last_value`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'nth_value',\n description: trim(`\n nth_value(expr, nth)\n\n Returns the nth value in the window frame.\n `),\n url: `${click}/window-functions/nth_value`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'nth', type: 'number'},\n ],\n returns: 'T',\n window: true,\n },\n\n // ============================================================================\n // Aggregate Functions\n // ============================================================================\n {\n name: 'any',\n description: trim(`\n any(arg)\n\n Returns the first encountered value.\n `),\n url: `${click}/aggregate-functions/reference/any`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'anylast',\n description: trim(`\n anyLast(arg)\n\n Returns the last encountered value.\n `),\n url: `${click}/aggregate-functions/reference/anylast`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n sqlName: 'anyLast',\n aliases: ['any_last'],\n },\n {\n name: 'avg',\n description: trim(`\n avg(arg)\n\n Computes the arithmetic mean of the input values.\n `),\n url: `${click}/aggregate-functions/reference/avg`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'avgif',\n description: trim(`\n avgIf(arg, condition)\n\n Computes the average of values where the condition is true.\n `),\n url: `${click}/aggregate-functions/combinators`,\n args: [\n {name: 'arg', type: 'number'},\n {name: 'condition', type: 'boolean'},\n ],\n returns: 'number',\n aggregate: true,\n sqlName: 'avgIf',\n aliases: ['avg_if'],\n },\n {\n name: 'count',\n description: trim(`\n count(arg)\n\n Counts rows, or the non-null values of arg when an argument is provided.\n `),\n url: `${click}/aggregate-functions/reference/count`,\n args: [{name: 'arg', type: 'any?'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'countif',\n description: trim(`\n countIf(condition)\n\n Counts rows where the condition is true.\n `),\n url: `${click}/aggregate-functions/combinators`,\n args: [{name: 'condition', type: 'boolean'}],\n returns: 'number',\n aggregate: true,\n sqlName: 'countIf',\n aliases: ['count_if'],\n },\n {\n name: 'grouparray',\n description: trim(`\n groupArray(arg)\n\n Collects the input values into an array.\n `),\n url: `${click}/aggregate-functions/reference/grouparray`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'array',\n aggregate: true,\n sqlName: 'groupArray',\n aliases: ['group_array'],\n },\n {\n name: 'max',\n description: trim(`\n max(arg)\n\n Returns the maximum value of arg.\n `),\n url: `${click}/aggregate-functions/reference/max`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'maxif',\n description: trim(`\n maxIf(arg, condition)\n\n Returns the maximum value where the condition is true.\n `),\n url: `${click}/aggregate-functions/combinators`,\n args: [\n {name: 'arg', type: 'T'},\n {name: 'condition', type: 'boolean'},\n ],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n sqlName: 'maxIf',\n aliases: ['max_if'],\n },\n {\n name: 'min',\n description: trim(`\n min(arg)\n\n Returns the minimum value of arg.\n `),\n url: `${click}/aggregate-functions/reference/min`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'minif',\n description: trim(`\n minIf(arg, condition)\n\n Returns the minimum value where the condition is true.\n `),\n url: `${click}/aggregate-functions/combinators`,\n args: [\n {name: 'arg', type: 'T'},\n {name: 'condition', type: 'boolean'},\n ],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n sqlName: 'minIf',\n aliases: ['min_if'],\n },\n {\n name: 'sum',\n description: trim(`\n sum(arg)\n\n Sums the numeric input values.\n `),\n url: `${click}/aggregate-functions/reference/sum`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'sumif',\n description: trim(`\n sumIf(arg, condition)\n\n Sums the values where the condition is true.\n `),\n url: `${click}/aggregate-functions/combinators`,\n args: [\n {name: 'arg', type: 'number'},\n {name: 'condition', type: 'boolean'},\n ],\n returns: 'number',\n aggregate: true,\n sqlName: 'sumIf',\n aliases: ['sum_if'],\n },\n {\n name: 'uniq',\n description: trim(`\n uniq(arg)\n\n Returns an approximate number of distinct values.\n `),\n url: `${click}/aggregate-functions/reference/uniq`,\n args: [{name: 'arg', type: 'any'}],\n returns: 'number',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'uniqexact',\n description: trim(`\n uniqExact(arg)\n\n Returns the exact number of distinct values.\n `),\n url: `${click}/aggregate-functions/reference/uniqexact`,\n args: [{name: 'arg', type: 'any'}],\n returns: 'number',\n aggregate: true,\n fanoutSafe: true,\n sqlName: 'uniqExact',\n aliases: ['uniq_exact'],\n },\n\n // ============================================================================\n // Numeric Functions\n // ============================================================================\n {\n name: 'abs',\n description: trim(`\n abs(x)\n\n Returns the absolute value of x.\n `),\n url: `${click}/functions/arithmetic-functions#abs`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n },\n {\n name: 'ceil',\n description: trim(`\n ceil(x)\n\n Rounds x up to the nearest integer.\n `),\n url: `${click}/functions/rounding-functions#ceil`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n },\n {\n name: 'ceiling',\n description: trim(`\n ceiling(x)\n\n Alias for ceil(x).\n `),\n url: `${click}/functions/rounding-functions#ceil`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n sqlName: 'ceiling',\n },\n {\n name: 'floor',\n description: trim(`\n floor(x)\n\n Rounds x down to the nearest integer.\n `),\n url: `${click}/functions/rounding-functions#floor`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n },\n {\n name: 'greatest',\n description: trim(`\n greatest(x, ...)\n\n Returns the largest value from the argument list.\n `),\n url: `${click}/functions/conditional-functions#greatest`,\n args: [{name: 'values', type: 'T...'}],\n returns: 'T',\n },\n {\n name: 'least',\n description: trim(`\n least(x, ...)\n\n Returns the smallest value from the argument list.\n `),\n url: `${click}/functions/conditional-functions#least`,\n args: [{name: 'values', type: 'T...'}],\n returns: 'T',\n },\n {\n name: 'pow',\n description: trim(`\n pow(x, y)\n\n Raises x to the power y.\n `),\n url: `${click}/functions/math-functions#pow`,\n args: [\n {name: 'x', type: 'number'},\n {name: 'y', type: 'number'},\n ],\n returns: 'number',\n },\n {\n name: 'power',\n description: trim(`\n power(x, y)\n\n Raises x to the power y.\n `),\n url: `${click}/functions/math-functions#pow`,\n args: [\n {name: 'x', type: 'number'},\n {name: 'y', type: 'number'},\n ],\n returns: 'number',\n },\n {\n name: 'round',\n description: trim(`\n round(x, precision)\n\n Rounds x to the requested number of decimal places.\n `),\n url: `${click}/functions/rounding-functions#round`,\n args: [\n {name: 'x', type: 'number'},\n {name: 'precision', type: 'number?'},\n ],\n returns: 'number',\n },\n {\n name: 'sqrt',\n description: trim(`\n sqrt(x)\n\n Returns the square root of x.\n `),\n url: `${click}/functions/math-functions#sqrt`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n },\n\n // ============================================================================\n // String Functions\n // ============================================================================\n {\n name: 'concat',\n description: trim(`\n concat(arg, ...)\n\n Concatenates the input strings.\n `),\n url: `${click}/functions/string-functions#concat`,\n args: [{name: 'values', type: 'string...'}],\n returns: 'string',\n },\n {\n name: 'endswith',\n description: trim(`\n endsWith(string, suffix)\n\n Returns true when string ends with suffix.\n `),\n url: `${click}/functions/string-functions#endswith`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'suffix', type: 'string'},\n ],\n returns: 'boolean',\n sqlName: 'endsWith',\n aliases: ['ends_with'],\n },\n {\n name: 'length',\n description: trim(`\n length(s)\n\n Returns the length of the string.\n `),\n url: `${click}/functions/string-functions#length`,\n args: [{name: 's', type: 'string'}],\n returns: 'number',\n },\n {\n name: 'lower',\n description: trim(`\n lower(s)\n\n Converts the string to lowercase.\n `),\n url: `${click}/functions/string-functions#lower`,\n args: [{name: 's', type: 'string'}],\n returns: 'string',\n },\n {\n name: 'match',\n description: trim(`\n match(string, pattern)\n\n Returns true when the string matches the regular expression.\n `),\n url: `${click}/functions/string-search-functions#match`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'pattern', type: 'string'},\n ],\n returns: 'boolean',\n },\n {\n name: 'position',\n description: trim(`\n position(string, substring)\n\n Returns the 1-based position of the substring.\n `),\n url: `${click}/functions/string-search-functions#position`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'substring', type: 'string'},\n ],\n returns: 'number',\n },\n {\n name: 'replace',\n description: trim(`\n replaceAll(string, pattern, replacement)\n\n Replaces every occurrence of pattern in string.\n `),\n url: `${click}/functions/string-replace-functions#replaceall`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'pattern', type: 'string'},\n {name: 'replacement', type: 'string'},\n ],\n returns: 'string',\n sqlName: 'replaceAll',\n },\n {\n name: 'splitbychar',\n description: trim(`\n splitByChar(sep, string)\n\n Splits the string by a single-character separator.\n `),\n url: `${click}/functions/splitting-merging-functions#splitbychar`,\n args: [\n {name: 'separator', type: 'string'},\n {name: 'string', type: 'string'},\n ],\n returns: 'array',\n sqlName: 'splitByChar',\n aliases: ['split_by_char'],\n },\n {\n name: 'startswith',\n description: trim(`\n startsWith(string, prefix)\n\n Returns true when string starts with prefix.\n `),\n url: `${click}/functions/string-functions#startswith`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'prefix', type: 'string'},\n ],\n returns: 'boolean',\n sqlName: 'startsWith',\n aliases: ['starts_with'],\n },\n {\n name: 'substring',\n description: trim(`\n substring(string, offset, length)\n\n Returns a substring starting at the requested position.\n `),\n url: `${click}/functions/string-functions#substring`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'offset', type: 'number'},\n {name: 'length', type: 'number?'},\n ],\n returns: 'string',\n },\n {\n name: 'trim',\n description: trim(`\n trim(string)\n\n Removes leading and trailing whitespace.\n `),\n url: `${click}/functions/string-functions#trim`,\n args: [{name: 'string', type: 'string'}],\n returns: 'string',\n },\n {\n name: 'upper',\n description: trim(`\n upper(s)\n\n Converts the string to uppercase.\n `),\n url: `${click}/functions/string-functions#upper`,\n args: [{name: 's', type: 'string'}],\n returns: 'string',\n },\n\n // ============================================================================\n // Conditional and Null Functions\n // ============================================================================\n {\n name: 'coalesce',\n description: trim(`\n coalesce(expr, ...)\n\n Returns the first non-null expression from the argument list.\n `),\n url: `${click}/functions/functions-for-nulls#coalesce`,\n args: [{name: 'expressions', type: 'T...'}],\n returns: 'T',\n },\n {\n name: 'if',\n description: trim(`\n if(condition, then, else)\n\n Returns then when the condition is true, otherwise returns else.\n `),\n url: `${click}/functions/conditional-functions#if`,\n args: [\n {name: 'condition', type: 'boolean'},\n {name: 'then', type: 'T'},\n {name: 'else', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'ifnull',\n description: trim(`\n ifNull(x, alt)\n\n Returns x when it is not null, otherwise returns alt.\n `),\n url: `${click}/functions/functions-for-nulls#ifnull`,\n args: [\n {name: 'x', type: 'T'},\n {name: 'alt', type: 'T'},\n ],\n returns: 'T',\n sqlName: 'ifNull',\n },\n {\n name: 'multiif',\n description: trim(`\n multiIf(cond1, then1, cond2, then2, else)\n\n Evaluates the conditions in order and returns the matching branch.\n `),\n url: `${click}/functions/conditional-functions#multiif`,\n args: [{name: 'branches', type: 'T...'}],\n returns: 'T',\n sqlName: 'multiIf',\n aliases: ['multi_if'],\n },\n {\n name: 'nullif',\n description: trim(`\n nullIf(x, y)\n\n Returns null when x equals y, otherwise returns x.\n `),\n url: `${click}/functions/functions-for-nulls#nullif`,\n args: [\n {name: 'x', type: 'T'},\n {name: 'y', type: 'T'},\n ],\n returns: 'T',\n sqlName: 'nullIf',\n },\n\n // ============================================================================\n // Date and Time Functions\n // ============================================================================\n {\n name: 'current_date',\n description: trim(`\n current_date()\n\n Returns the current date.\n `),\n url: `${click}/functions/date-time-functions#current_date`,\n args: [],\n returns: 'date',\n },\n {\n name: 'current_timestamp',\n description: trim(`\n current_timestamp()\n\n Returns the current timestamp.\n `),\n url: `${click}/functions/date-time-functions#now`,\n args: [],\n returns: 'timestamp',\n },\n {\n name: 'date_diff',\n description: trim(`\n date_diff(unit, start, end)\n\n Returns the difference between two dates or timestamps in the requested unit.\n `),\n url: `${click}/functions/date-time-functions#date_diff`,\n args: [\n {name: 'unit', type: 'string'},\n {name: 'start', type: ['date', 'timestamp']},\n {name: 'end', type: ['date', 'timestamp']},\n ],\n returns: 'number',\n },\n {\n name: 'date_trunc',\n description: trim(`\n date_trunc(unit, datetime)\n\n Truncates a date or timestamp to the requested precision.\n `),\n url: `${click}/functions/date-time-functions#datetrunc`,\n args: [\n {name: 'date_part', type: 'string'},\n {name: 'datetime', type: ['date', 'timestamp']},\n ],\n returns: 'timestamp',\n metadata: args => inferGrain(args[0]?.sql),\n sqlTemplate: 'DATE_TRUNC(${date_part}, ${datetime})',\n },\n {\n name: 'formatdatetime',\n description: trim(`\n formatDateTime(datetime, format)\n\n Formats a date or timestamp as a string.\n `),\n url: `${click}/functions/date-time-functions#formatdatetime`,\n args: [\n {name: 'datetime', type: ['date', 'timestamp']},\n {name: 'format', type: 'string'},\n ],\n returns: 'string',\n sqlName: 'formatDateTime',\n aliases: ['format_datetime'],\n },\n {\n name: 'now',\n description: trim(`\n now()\n\n Returns the current timestamp.\n `),\n url: `${click}/functions/date-time-functions#now`,\n args: [],\n returns: 'timestamp',\n },\n {\n name: 'parsedatetimebesteffort',\n description: trim(`\n parseDateTimeBestEffort(text)\n\n Parses a string into a timestamp using ClickHouse's best-effort parser.\n `),\n url: `${click}/functions/type-conversion-functions#parsedatetimebesteffort`,\n args: [{name: 'text', type: 'string'}],\n returns: 'timestamp',\n sqlName: 'parseDateTimeBestEffort',\n aliases: ['parse_datetime_best_effort'],\n },\n {\n name: 'today',\n description: trim(`\n today()\n\n Returns the current date.\n `),\n url: `${click}/functions/date-time-functions#today`,\n args: [],\n returns: 'date',\n },\n {\n name: 'todate',\n description: trim(`\n toDate(value)\n\n Converts the value to a date.\n `),\n url: `${click}/functions/type-conversion-functions#todate`,\n args: [{name: 'value', type: ['string', 'date', 'timestamp', 'number']}],\n returns: 'date',\n sqlName: 'toDate',\n aliases: ['to_date'],\n },\n {\n name: 'todatetime',\n description: trim(`\n toDateTime(value)\n\n Converts the value to a timestamp.\n `),\n url: `${click}/functions/type-conversion-functions#todatetime`,\n args: [{name: 'value', type: ['string', 'date', 'timestamp', 'number']}],\n returns: 'timestamp',\n sqlName: 'toDateTime',\n aliases: ['to_datetime'],\n },\n {\n name: 'todayofmonth',\n description: trim(`\n toDayOfMonth(datetime)\n\n Extracts the day of the month.\n `),\n url: `${click}/functions/date-time-functions#todayofmonth`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('day', 'clickhouse'),\n sqlName: 'toDayOfMonth',\n aliases: ['to_day_of_month'],\n },\n {\n name: 'todayofyear',\n description: trim(`\n toDayOfYear(datetime)\n\n Extracts the day of the year.\n `),\n url: `${click}/functions/date-time-functions#todayofyear`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('dayofyear', 'clickhouse'),\n sqlName: 'toDayOfYear',\n aliases: ['to_day_of_year'],\n },\n {\n name: 'todayofweek',\n description: trim(`\n toDayOfWeek(datetime)\n\n Extracts the day of the week.\n `),\n url: `${click}/functions/date-time-functions#todayofweek`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('dayofweek', 'clickhouse'),\n sqlName: 'toDayOfWeek',\n aliases: ['to_day_of_week'],\n },\n {\n name: 'tohour',\n description: trim(`\n toHour(datetime)\n\n Extracts the hour.\n `),\n url: `${click}/functions/date-time-functions#tohour`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('hour', 'clickhouse'),\n sqlName: 'toHour',\n aliases: ['to_hour'],\n },\n {\n name: 'tominute',\n description: trim(`\n toMinute(datetime)\n\n Extracts the minute.\n `),\n url: `${click}/functions/date-time-functions#tominute`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('minute', 'clickhouse'),\n sqlName: 'toMinute',\n aliases: ['to_minute'],\n },\n {\n name: 'tomonth',\n description: trim(`\n toMonth(datetime)\n\n Extracts the month number.\n `),\n url: `${click}/functions/date-time-functions#tomonth`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('month', 'clickhouse'),\n sqlName: 'toMonth',\n aliases: ['to_month'],\n },\n {\n name: 'toquarter',\n description: trim(`\n toQuarter(datetime)\n\n Extracts the quarter.\n `),\n url: `${click}/functions/date-time-functions#toquarter`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('quarter', 'clickhouse'),\n sqlName: 'toQuarter',\n aliases: ['to_quarter'],\n },\n {\n name: 'tosecond',\n description: trim(`\n toSecond(datetime)\n\n Extracts the second.\n `),\n url: `${click}/functions/date-time-functions#tosecond`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('second', 'clickhouse'),\n sqlName: 'toSecond',\n aliases: ['to_second'],\n },\n {\n name: 'toweek',\n description: trim(`\n toWeek(datetime)\n\n Extracts the week number.\n `),\n url: `${click}/functions/date-time-functions#toweek`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('week', 'clickhouse'),\n sqlName: 'toWeek',\n aliases: ['to_week'],\n },\n {\n name: 'tostartofday',\n description: trim(`\n toStartOfDay(datetime)\n\n Truncates to the start of the day.\n `),\n url: `${click}/functions/date-time-functions#tostartofday`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'timestamp',\n metadata: {timeGrain: 'day'},\n sqlName: 'toStartOfDay',\n aliases: ['to_start_of_day'],\n },\n {\n name: 'tostartofmonth',\n description: trim(`\n toStartOfMonth(datetime)\n\n Truncates to the start of the month.\n `),\n url: `${click}/functions/date-time-functions#tostartofmonth`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'timestamp',\n metadata: {timeGrain: 'month'},\n sqlName: 'toStartOfMonth',\n aliases: ['to_start_of_month'],\n },\n {\n name: 'tostartofquarter',\n description: trim(`\n toStartOfQuarter(datetime)\n\n Truncates to the start of the quarter.\n `),\n url: `${click}/functions/date-time-functions#tostartofquarter`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'timestamp',\n metadata: {timeGrain: 'quarter'},\n sqlName: 'toStartOfQuarter',\n aliases: ['to_start_of_quarter'],\n },\n {\n name: 'tostartofweek',\n description: trim(`\n toStartOfWeek(datetime)\n\n Truncates to the start of the week.\n `),\n url: `${click}/functions/date-time-functions#tostartofweek`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'timestamp',\n metadata: {timeGrain: 'week'},\n sqlName: 'toStartOfWeek',\n aliases: ['to_start_of_week'],\n },\n {\n name: 'tostartofyear',\n description: trim(`\n toStartOfYear(datetime)\n\n Truncates to the start of the year.\n `),\n url: `${click}/functions/date-time-functions#tostartofyear`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'timestamp',\n metadata: {timeGrain: 'year'},\n sqlName: 'toStartOfYear',\n aliases: ['to_start_of_year'],\n },\n {\n name: 'toyear',\n description: trim(`\n toYear(datetime)\n\n Extracts the year number.\n `),\n url: `${click}/functions/date-time-functions#toyear`,\n args: [{name: 'datetime', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('year', 'clickhouse'),\n sqlName: 'toYear',\n aliases: ['to_year'],\n },\n]\n", "// DuckDB SQL function definitions\n// These get converted to Malloy blueprints in functions.ts\n//\n// Documentation is copied verbatim from:\n// https://duckdb.org/docs/stable/sql/functions/\n\nimport type {FunctionDef} from './functionTypes.ts'\n\nimport {inferTimeOrdinal, inferGrain} from './temporalMetadata.ts'\nimport {trimIndentation} from './util.ts'\n\nconst duck = 'https://duckdb.org/docs/stable/sql/functions'\n\n// Helper to trim and dedent multiline strings\nconst trim = trimIndentation\n\nexport const duckDbFunctions: FunctionDef[] = [\n // ============================================================================\n // Window Functions\n // https://duckdb.org/docs/stable/sql/functions/window_functions.html\n // ============================================================================\n {\n name: 'row_number',\n description: trim('row_number() returns the current row number within the window partition.'),\n url: `${duck}/window_functions.html#row_number`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'rank',\n description: trim('rank() returns the rank of the current row with gaps for ties.'),\n url: `${duck}/window_functions.html#rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'dense_rank',\n description: trim('dense_rank() returns the rank of the current row without gaps.'),\n url: `${duck}/window_functions.html#dense_rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'ntile',\n description: trim('ntile(num_buckets) returns the bucket number for the current row.'),\n url: `${duck}/window_functions.html#ntilenum_buckets-order-by-ordering`,\n args: [{name: 'num_buckets', type: 'number'}],\n returns: 'number',\n window: true,\n },\n {\n name: 'lag',\n description: trim('lag(expr, offset, default) returns a prior row value within the window partition.'),\n url: `${duck}/window_functions.html#lagexpr-offset-default-order-by-ordering-ignore-nulls`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'lead',\n description: trim('lead(expr, offset, default) returns a following row value within the window partition.'),\n url: `${duck}/window_functions.html#leadexpr-offset-default-order-by-ordering-ignore-nulls`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'first_value',\n description: trim('first_value(expr) returns the first value in the window frame.'),\n url: `${duck}/window_functions.html#first_valueexpr-order-by-ordering-ignore-nulls`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'last_value',\n description: trim('last_value(expr) returns the last value in the window frame.'),\n url: `${duck}/window_functions.html#last_valueexpr-order-by-ordering-ignore-nulls`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'nth_value',\n description: trim('nth_value(expr, nth) returns the nth value in the window frame.'),\n url: `${duck}/window_functions.html#nth_valueexpr-nth-order-by-ordering-ignore-nulls`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'nth', type: 'number'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'percent_rank',\n description: trim('percent_rank() returns the relative rank of the current row.'),\n url: `${duck}/window_functions.html#percent_rank-order-by-ordering`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'cume_dist',\n description: trim('cume_dist() returns the cumulative distribution value for the current row.'),\n url: `${duck}/window_functions.html#cume_dist-order-by-ordering`,\n args: [],\n returns: 'number',\n window: true,\n },\n\n // ============================================================================\n // Aggregate Functions\n // https://duckdb.org/docs/stable/sql/functions/aggregates.html\n // ============================================================================\n\n {\n name: 'any_value',\n description: trim(`\n any_value(arg)\n\n Returns the first non-null value from arg. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#any_valuearg`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'arg_max',\n description: trim(`\n arg_max(arg, val)\n\n Finds the row with the maximum val and calculates the arg expression at that row. Rows where the value of the arg or val expression is NULL are ignored. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#arg_maxarg-val`,\n args: [\n {name: 'arg', type: 'T', description: 'The value to return.'},\n {name: 'val', type: 'any', description: 'The value used to determine the maximum.'},\n ],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'arg_min',\n description: trim(`\n arg_min(arg, val)\n\n Finds the row with the minimum val and calculates the arg expression at that row. Rows where the value of the arg or val expression is NULL are ignored. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#arg_minarg-val`,\n args: [\n {name: 'arg', type: 'T', description: 'The value to return.'},\n {name: 'val', type: 'any', description: 'The value used to determine the minimum.'},\n ],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'avg',\n description: trim(`\n avg(arg)\n\n Calculates the average of all non-null values in arg. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#avgarg`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bit_and',\n description: trim(`\n bit_and(arg)\n\n Returns the bitwise AND of all bits in a given expression.\n `),\n url: `${duck}/aggregates#bit_andarg`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bit_or',\n description: trim(`\n bit_or(arg)\n\n Returns the bitwise OR of all bits in a given expression.\n `),\n url: `${duck}/aggregates#bit_orarg`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bit_xor',\n description: trim(`\n bit_xor(arg)\n\n Returns the bitwise XOR of all bits in a given expression.\n `),\n url: `${duck}/aggregates#bit_xorarg`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bool_and',\n description: trim(`\n bool_and(arg)\n\n Returns true if every input value is true, otherwise false.\n `),\n url: `${duck}/aggregates#bool_andarg`,\n args: [{name: 'arg', type: 'boolean'}],\n returns: 'boolean',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'bool_or',\n description: trim(`\n bool_or(arg)\n\n Returns true if any input value is true, otherwise false.\n `),\n url: `${duck}/aggregates#bool_orarg`,\n args: [{name: 'arg', type: 'boolean'}],\n returns: 'boolean',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'count',\n description: trim(`\n count(arg)\n\n Returns the number of rows where arg is not NULL.\n `),\n url: `${duck}/aggregates#countarg`,\n args: [{name: 'arg', type: 'any?'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'first',\n description: trim(`\n first(arg)\n\n Returns the first value (null or non-null) from arg. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#firstarg`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'last',\n description: trim(`\n last(arg)\n\n Returns the last value of a column. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#lastarg`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'list',\n description: trim(`\n list(arg)\n\n Returns a LIST containing all the values of a column. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#listarg`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'array',\n aggregate: true,\n },\n {\n name: 'max',\n description: trim(`\n max(arg)\n\n Returns the maximum value present in arg.\n `),\n url: `${duck}/aggregates#maxarg`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'min',\n description: trim(`\n min(arg)\n\n Returns the minimum value present in arg.\n `),\n url: `${duck}/aggregates#minarg`,\n args: [{name: 'arg', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'product',\n description: trim(`\n product(arg)\n\n Calculates the product of all non-null values in arg. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#productarg`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'string_agg',\n description: trim(`\n string_agg(arg, sep)\n\n Concatenates the column string values with a separator. This function is affected by ordering.\n If no separator is provided, defaults to comma.\n `),\n url: `${duck}/aggregates#string_aggarg-sep`,\n args: [\n {name: 'arg', type: 'string'},\n {name: 'sep', type: 'string?'},\n ],\n returns: 'string',\n aggregate: true,\n },\n {\n name: 'sum',\n description: trim(`\n sum(arg)\n\n Calculates the sum of all non-null values in arg.\n `),\n url: `${duck}/aggregates#sumarg`,\n args: [{name: 'arg', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n\n // ============================================================================\n // Statistical Aggregate Functions\n // https://duckdb.org/docs/stable/sql/functions/aggregates.html#statistical-aggregates\n // ============================================================================\n\n {\n name: 'corr',\n description: trim(`\n corr(y, x)\n\n The correlation coefficient.\n `),\n url: `${duck}/aggregates#corry-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'covar_pop',\n description: trim(`\n covar_pop(y, x)\n\n The population covariance, which does not include bias correction.\n `),\n url: `${duck}/aggregates#covar_popy-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'covar_samp',\n description: trim(`\n covar_samp(y, x)\n\n The sample covariance, which includes Bessel's bias correction.\n `),\n url: `${duck}/aggregates#covar_sampy-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'entropy',\n description: trim(`\n entropy(x)\n\n The log-2 entropy of count input-values.\n `),\n url: `${duck}/aggregates#entropyx`,\n args: [{name: 'x', type: 'any'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'kurtosis',\n description: trim(`\n kurtosis(x)\n\n The excess kurtosis (Fisher's definition) with bias correction according to the sample size.\n `),\n url: `${duck}/aggregates#kurtosisx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'mad',\n description: trim(`\n mad(x)\n\n The median absolute deviation. Temporal types return a positive INTERVAL.\n `),\n url: `${duck}/aggregates#madx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'median',\n description: trim(`\n median(x)\n\n The middle value of the set. For even value counts, quantitative values are averaged and ordinal values return the lower value.\n `),\n url: `${duck}/aggregates#medianx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'mode',\n description: trim(`\n mode(x)\n\n The most frequent value. This function is affected by ordering.\n `),\n url: `${duck}/aggregates#modex`,\n args: [{name: 'x', type: 'T'}],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'quantile_cont',\n description: trim(`\n quantile_cont(x, pos)\n\n The interpolated pos-quantile of x for 0 <= pos <= 1.\n `),\n url: `${duck}/aggregates#quantile_contx-pos`,\n args: [\n {name: 'x', type: 'number'},\n {name: 'pos', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'quantile_disc',\n description: trim(`\n quantile_disc(x, pos)\n\n The discrete pos-quantile of x for 0 <= pos <= 1.\n `),\n url: `${duck}/aggregates#quantile_discx-pos`,\n args: [\n {name: 'x', type: 'T'},\n {name: 'pos', type: 'number'},\n ],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'regr_avgx',\n description: trim(`\n regr_avgx(y, x)\n\n The average of the independent variable for non-NULL pairs.\n `),\n url: `${duck}/aggregates#regr_avgxy-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_avgy',\n description: trim(`\n regr_avgy(y, x)\n\n The average of the dependent variable for non-NULL pairs.\n `),\n url: `${duck}/aggregates#regr_avgyy-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_count',\n description: trim(`\n regr_count(y, x)\n\n The number of non-NULL pairs.\n `),\n url: `${duck}/aggregates#regr_county-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_intercept',\n description: trim(`\n regr_intercept(y, x)\n\n The intercept of the univariate linear regression line.\n `),\n url: `${duck}/aggregates#regr_intercepty-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_r2',\n description: trim(`\n regr_r2(y, x)\n\n The squared Pearson correlation coefficient between y and x.\n `),\n url: `${duck}/aggregates#regr_r2y-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_slope',\n description: trim(`\n regr_slope(y, x)\n\n The slope of the linear regression line.\n `),\n url: `${duck}/aggregates#regr_slopey-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_sxx',\n description: trim(`\n regr_sxx(y, x)\n\n The sample variance of the independent variable for non-NULL pairs.\n `),\n url: `${duck}/aggregates#regr_sxxy-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_sxy',\n description: trim(`\n regr_sxy(y, x)\n\n The sample covariance, which includes Bessel's bias correction.\n `),\n url: `${duck}/aggregates#regr_sxyy-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_syy',\n description: trim(`\n regr_syy(y, x)\n\n The sample variance of the dependent variable for non-NULL pairs.\n `),\n url: `${duck}/aggregates#regr_syyy-x`,\n args: [\n {name: 'y', type: 'number'},\n {name: 'x', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'skewness',\n description: trim(`\n skewness(x)\n\n The skewness.\n `),\n url: `${duck}/aggregates#skewnessx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'stddev_pop',\n description: trim(`\n stddev_pop(x)\n\n The population standard deviation.\n `),\n url: `${duck}/aggregates#stddev_popx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'stddev_samp',\n description: trim(`\n stddev_samp(x)\n\n The sample standard deviation.\n `),\n url: `${duck}/aggregates#stddev_sampx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'var_pop',\n description: trim(`\n var_pop(x)\n\n The population variance, which does not include bias correction.\n `),\n url: `${duck}/aggregates#var_popx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'var_samp',\n description: trim(`\n var_samp(x)\n\n The sample variance, which includes Bessel's bias correction.\n `),\n url: `${duck}/aggregates#var_sampx`,\n args: [{name: 'x', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n\n // ============================================================================\n // Approximate Aggregate Functions\n // https://duckdb.org/docs/stable/sql/functions/aggregates.html#approximate-aggregates\n // ============================================================================\n\n {\n name: 'approx_count_distinct',\n description: trim(`\n approx_count_distinct(x)\n\n Calculates the approximate count of distinct elements using HyperLogLog.\n `),\n url: `${duck}/aggregates#approx_count_distinctx`,\n args: [{name: 'x', type: 'any'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'approx_quantile',\n description: trim(`\n approx_quantile(x, pos)\n\n Calculates the approximate quantile using T-Digest.\n `),\n url: `${duck}/aggregates#approx_quantilex-pos`,\n args: [\n {name: 'x', type: 'number'},\n {name: 'pos', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'reservoir_quantile',\n description: trim(`\n reservoir_quantile(x, quantile, sample_size)\n\n Calculates the approximate quantile using reservoir sampling, the sample size is optional and uses 8192 as a default size.\n `),\n url: `${duck}/aggregates#reservoir_quantilex-quantile-sample_size`,\n args: [\n {name: 'x', type: 'number'},\n {name: 'quantile', type: 'number'},\n {name: 'sample_size', type: 'number?'},\n ],\n returns: 'number',\n aggregate: true,\n },\n\n // ============================================================================\n // Numeric Functions\n // https://duckdb.org/docs/stable/sql/functions/numeric.html\n // ============================================================================\n\n {\n name: 'abs',\n description: trim(`\n abs(x)\n\n Absolute value.\n `),\n url: `${duck}/numeric#absx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'acos',\n description: trim(`\n acos(x)\n\n Computes the inverse cosine of x.\n `),\n url: `${duck}/numeric#acosx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'acosh',\n description: trim(`\n acosh(x)\n\n Computes the inverse hyperbolic cosine of x.\n `),\n url: `${duck}/numeric#acoshx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'asin',\n description: trim(`\n asin(x)\n\n Computes the inverse sine of x.\n `),\n url: `${duck}/numeric#asinx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'asinh',\n description: trim(`\n asinh(x)\n\n Computes the inverse hyperbolic sine of x.\n `),\n url: `${duck}/numeric#asinhx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'atan',\n description: trim(`\n atan(x)\n\n Computes the inverse tangent of x.\n `),\n url: `${duck}/numeric#atanx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'atanh',\n description: trim(`\n atanh(x)\n\n Computes the inverse hyperbolic tangent of x.\n `),\n url: `${duck}/numeric#atanhx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'atan2',\n description: trim(`\n atan2(y, x)\n\n Computes the inverse tangent of (y, x).\n `),\n url: `${duck}/numeric#atan2y-x`,\n args: [\n ['y', 'number'],\n ['x', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'bit_count',\n description: trim(`\n bit_count(x)\n\n Returns the number of bits that are set.\n `),\n url: `${duck}/numeric#bit_countx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cbrt',\n description: trim(`\n cbrt(x)\n\n Returns the cube root of the number.\n `),\n url: `${duck}/numeric#cbrtx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'ceil',\n description: trim(`\n ceil(x)\n\n Rounds the number up.\n `),\n url: `${duck}/numeric#ceilx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'ceiling',\n description: trim(`\n ceiling(x)\n\n Rounds the number up. Alias of ceil.\n `),\n url: `${duck}/numeric#ceilingx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cos',\n description: trim(`\n cos(x)\n\n Computes the cosine of x.\n `),\n url: `${duck}/numeric#cosx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cot',\n description: trim(`\n cot(x)\n\n Computes the cotangent of x.\n `),\n url: `${duck}/numeric#cotx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'degrees',\n description: trim(`\n degrees(x)\n\n Converts radians to degrees.\n `),\n url: `${duck}/numeric#degreesx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'even',\n description: trim(`\n even(x)\n\n Round to next even number by rounding away from zero.\n `),\n url: `${duck}/numeric#evenx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'exp',\n description: trim(`\n exp(x)\n\n Computes e ** x.\n `),\n url: `${duck}/numeric#expx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'factorial',\n description: trim(`\n factorial(x)\n\n Computes the product of the current integer and all integers below it.\n `),\n url: `${duck}/numeric#factorialx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'floor',\n description: trim(`\n floor(x)\n\n Rounds the number down.\n `),\n url: `${duck}/numeric#floorx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'gamma',\n description: trim(`\n gamma(x)\n\n Interpolation of the factorial of x - 1. Fractional inputs are allowed.\n `),\n url: `${duck}/numeric#gammax`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'gcd',\n description: trim(`\n gcd(x, y)\n\n Computes the greatest common divisor of x and y.\n `),\n url: `${duck}/numeric#gcdx-y`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'greatest',\n description: trim(`\n greatest(x1, x2, ...)\n\n Selects the largest value.\n `),\n url: `${duck}/numeric#greatestx1-x2-`,\n args: [['values', 'T...']],\n returns: 'T',\n },\n {\n name: 'isfinite',\n description: trim(`\n isfinite(x)\n\n Returns true if the floating point value is finite, false otherwise.\n `),\n url: `${duck}/numeric#isfinitex`,\n args: [['x', 'number']],\n returns: 'boolean',\n },\n {\n name: 'isinf',\n description: trim(`\n isinf(x)\n\n Returns true if the floating point value is infinite, false otherwise.\n `),\n url: `${duck}/numeric#isinfx`,\n args: [['x', 'number']],\n returns: 'boolean',\n },\n {\n name: 'isnan',\n description: trim(`\n isnan(x)\n\n Returns true if the floating point value is not a number, false otherwise.\n `),\n url: `${duck}/numeric#isnanx`,\n args: [['x', 'number']],\n returns: 'boolean',\n },\n {\n name: 'lcm',\n description: trim(`\n lcm(x, y)\n\n Computes the least common multiple of x and y.\n `),\n url: `${duck}/numeric#lcmx-y`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'least',\n description: trim(`\n least(x1, x2, ...)\n\n Selects the smallest value.\n `),\n url: `${duck}/numeric#leastx1-x2-`,\n args: [['values', 'T...']],\n returns: 'T',\n },\n {\n name: 'lgamma',\n description: trim(`\n lgamma(x)\n\n Computes the log of the gamma function.\n `),\n url: `${duck}/numeric#lgammax`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'ln',\n description: trim(`\n ln(x)\n\n Computes the natural logarithm of x.\n `),\n url: `${duck}/numeric#lnx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'log',\n description: trim(`\n log(x)\n\n Computes the base-10 logarithm of x.\n `),\n url: `${duck}/numeric#logx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'log10',\n description: trim(`\n log10(x)\n\n Alias of log. Computes the base-10 logarithm of x.\n `),\n url: `${duck}/numeric#log10x`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'log2',\n description: trim(`\n log2(x)\n\n Computes the base-2 log of x.\n `),\n url: `${duck}/numeric#log2x`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'pi',\n description: trim(`\n pi()\n\n Returns the value of pi.\n `),\n url: `${duck}/numeric#pi`,\n args: [],\n returns: 'number',\n },\n {\n name: 'pow',\n description: trim(`\n pow(x, y)\n\n Computes x to the power of y.\n `),\n url: `${duck}/numeric#powx-y`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'power',\n description: trim(`\n power(x, y)\n\n Alias of pow. Computes x to the power of y.\n `),\n url: `${duck}/numeric#powerx-y`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'radians',\n description: trim(`\n radians(x)\n\n Converts degrees to radians.\n `),\n url: `${duck}/numeric#radiansx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'random',\n description: trim(`\n random()\n\n Returns a random number x in the range 0.0 <= x < 1.0.\n `),\n url: `${duck}/numeric#random`,\n args: [],\n returns: 'number',\n },\n {\n name: 'round',\n description: trim(`\n round(v, s)\n\n Round to s decimal places. Values s < 0 are allowed.\n `),\n url: `${duck}/numeric#roundv-numeric-s-integer`,\n args: [\n ['v', 'number'],\n ['s', 'number?'],\n ],\n returns: 'number',\n },\n {\n name: 'setseed',\n description: trim(`\n setseed(x)\n\n Sets the seed to be used for the random function.\n `),\n url: `${duck}/numeric#setseedx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sign',\n description: trim(`\n sign(x)\n\n Returns the sign of x as -1, 0 or 1.\n `),\n url: `${duck}/numeric#signx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'signbit',\n description: trim(`\n signbit(x)\n\n Returns whether the signbit is set or not.\n `),\n url: `${duck}/numeric#signbitx`,\n args: [['x', 'number']],\n returns: 'boolean',\n },\n {\n name: 'sin',\n description: trim(`\n sin(x)\n\n Computes the sin of x.\n `),\n url: `${duck}/numeric#sinx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sqrt',\n description: trim(`\n sqrt(x)\n\n Returns the square root of the number.\n `),\n url: `${duck}/numeric#sqrtx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'tan',\n description: trim(`\n tan(x)\n\n Computes the tangent of x.\n `),\n url: `${duck}/numeric#tanx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'trunc',\n description: trim(`\n trunc(x)\n\n Truncates the number.\n `),\n url: `${duck}/numeric#truncx`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'xor',\n description: trim(`\n xor(x, y)\n\n Bitwise XOR.\n `),\n url: `${duck}/numeric#xorx-y`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n\n // ============================================================================\n // Text Functions\n // https://duckdb.org/docs/stable/sql/functions/text.html\n // ============================================================================\n\n {\n name: 'ascii',\n description: trim(`\n ascii(string)\n\n Returns an integer that represents the Unicode code point of the first character of the string.\n `),\n url: `${duck}/text#asciistring`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'chr',\n description: trim(`\n chr(code_point)\n\n Returns a character which is corresponding the ASCII code value or Unicode code point.\n `),\n url: `${duck}/text#chrcode_point`,\n args: [['code_point', 'number']],\n returns: 'string',\n },\n {\n name: 'concat',\n description: trim(`\n concat(value, ...)\n\n Concatenates multiple strings or lists. NULL inputs are skipped.\n `),\n url: `${duck}/text#concatvalue-`,\n args: [['values', 'string...']],\n returns: 'string',\n },\n {\n name: 'concat_ws',\n description: trim(`\n concat_ws(separator, string, ...)\n\n Concatenates many strings, separated by separator. NULL inputs are skipped.\n `),\n url: `${duck}/text#concat_wsseparator-string-`,\n args: [\n {name: 'separator', type: 'string'},\n {name: 'strings', type: 'string...'},\n ],\n returns: 'string',\n },\n {\n name: 'contains',\n description: trim(`\n contains(string, search_string)\n\n Returns true if search_string is found within string.\n `),\n url: `${duck}/text#containsstring-search_string`,\n args: [\n ['string', 'string'],\n ['search_string', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'ends_with',\n description: trim(`\n ends_with(string, search_string)\n\n Returns true if string ends with search_string.\n `),\n url: `${duck}/text#suffixstring-search_string`,\n args: [\n ['string', 'string'],\n ['search_string', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'format',\n description: trim(`\n format(format, ...)\n\n Formats a string using the fmt syntax.\n `),\n url: `${duck}/text#formatformat-`,\n args: [\n {name: 'format_string', type: 'string'},\n {name: 'values', type: 'any...'},\n ],\n returns: 'string',\n },\n {\n name: 'instr',\n description: trim(`\n instr(string, search_string)\n\n Returns location of first occurrence of search_string in string, counting from 1. Returns 0 if no match found.\n `),\n url: `${duck}/text#instrstring-search_string`,\n args: [\n ['string', 'string'],\n ['search_string', 'string'],\n ],\n returns: 'number',\n },\n {\n name: 'left',\n description: trim(`\n left(string, count)\n\n Extracts the left-most count characters.\n `),\n url: `${duck}/text#leftstring-count`,\n args: [\n ['string', 'string'],\n ['count', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'length',\n description: trim(`\n length(string)\n\n Number of characters in string.\n `),\n url: `${duck}/text#lengthstring`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'lower',\n description: trim(`\n lower(string)\n\n Converts string to lower case.\n `),\n url: `${duck}/text#lowerstring`,\n args: [['string', 'string']],\n returns: 'string',\n },\n {\n name: 'lpad',\n description: trim(`\n lpad(string, count, character)\n\n Pads the string with the character on the left until it has count characters. Truncates the string on the right if it has more than count characters.\n `),\n url: `${duck}/text#lpadstring-count-character`,\n args: [\n ['string', 'string'],\n ['count', 'number'],\n ['character', 'string'],\n ],\n returns: 'string',\n },\n {\n name: 'ltrim',\n description: trim(`\n ltrim(string, characters)\n\n Removes any occurrences of any of the characters from the left side of the string.\n `),\n url: `${duck}/text#ltrimstring-characters`,\n args: [\n ['string', 'string'],\n ['characters', 'string?'],\n ],\n returns: 'string',\n },\n {\n name: 'md5',\n description: trim(`\n md5(string)\n\n Returns the MD5 hash of the string as a VARCHAR.\n `),\n url: `${duck}/text#md5string`,\n args: [['string', 'string']],\n returns: 'string',\n },\n {\n name: 'printf',\n description: trim(`\n printf(format, ...)\n\n Formats a string using printf syntax.\n `),\n url: `${duck}/text#printfformat-`,\n args: [\n {name: 'format_string', type: 'string'},\n {name: 'values', type: 'any...'},\n ],\n returns: 'string',\n },\n {\n name: 'regexp_extract',\n description: trim(`\n regexp_extract(string, regex, group)\n\n If string contains the regex pattern, returns the capturing group specified by optional parameter group; otherwise, returns the empty string.\n `),\n url: `${duck}/text#regexp_extractstring-regex-group-options`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'regex', type: 'string'},\n {name: 'group', type: 'number?'},\n ],\n returns: 'string',\n },\n {\n name: 'regexp_matches',\n description: trim(`\n regexp_matches(string, regex)\n\n Returns true if string contains the regex, false otherwise.\n `),\n url: `${duck}/text#regexp_matchesstring-regex-options`,\n args: [\n ['string', 'string'],\n ['regex', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'regexp_replace',\n description: trim(`\n regexp_replace(string, regex, replacement)\n\n If string contains the regex, replaces the matching part with replacement.\n `),\n url: `${duck}/text#regexp_replacestring-regex-replacement-options`,\n args: [\n ['string', 'string'],\n ['regex', 'string'],\n ['replacement', 'string'],\n ],\n returns: 'string',\n },\n {\n name: 'repeat',\n description: trim(`\n repeat(string, count)\n\n Repeats the string count number of times.\n `),\n url: `${duck}/text#repeatstring-count`,\n args: [\n ['string', 'string'],\n ['count', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'replace',\n description: trim(`\n replace(string, source, target)\n\n Replaces any occurrences of the source with target in string.\n `),\n url: `${duck}/text#replacestring-source-target`,\n args: [\n ['string', 'string'],\n ['source', 'string'],\n ['target', 'string'],\n ],\n returns: 'string',\n },\n {\n name: 'reverse',\n description: trim(`\n reverse(string)\n\n Reverses the string.\n `),\n url: `${duck}/text#reversestring`,\n args: [['string', 'string']],\n returns: 'string',\n },\n {\n name: 'right',\n description: trim(`\n right(string, count)\n\n Extract the right-most count characters.\n `),\n url: `${duck}/text#rightstring-count`,\n args: [\n ['string', 'string'],\n ['count', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'rpad',\n description: trim(`\n rpad(string, count, character)\n\n Pads the string with the character on the right until it has count characters. Truncates the string on the right if it has more than count characters.\n `),\n url: `${duck}/text#rpadstring-count-character`,\n args: [\n ['string', 'string'],\n ['count', 'number'],\n ['character', 'string'],\n ],\n returns: 'string',\n },\n {\n name: 'rtrim',\n description: trim(`\n rtrim(string, characters)\n\n Removes any occurrences of any of the characters from the right side of the string.\n `),\n url: `${duck}/text#rtrimstring-characters`,\n args: [\n ['string', 'string'],\n ['characters', 'string?'],\n ],\n returns: 'string',\n },\n {\n name: 'split_part',\n description: trim(`\n split_part(string, separator, index)\n\n Splits the string along the separator and returns the data at the (1-based) index of the list.\n `),\n url: `${duck}/text#split_partstring-separator-index`,\n args: [\n ['string', 'string'],\n ['separator', 'string'],\n ['index', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'starts_with',\n description: trim(`\n starts_with(string, search_string)\n\n Returns true if string begins with search_string.\n `),\n url: `${duck}/text#starts_withstring-search_string`,\n args: [\n ['string', 'string'],\n ['search_string', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'string_split',\n description: trim(`\n string_split(string, separator)\n\n Splits the string along the separator.\n `),\n url: `${duck}/text#string_splitstring-separator`,\n args: [\n ['string', 'string'],\n ['separator', 'string'],\n ],\n returns: 'array',\n },\n {\n name: 'strip_accents',\n description: trim(`\n strip_accents(string)\n\n Strips accents from string.\n `),\n url: `${duck}/text#strip_accentsstring`,\n args: [['string', 'string']],\n returns: 'string',\n },\n {\n name: 'strlen',\n description: trim(`\n strlen(string)\n\n Number of bytes in string.\n `),\n url: `${duck}/text#strlenstring`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'strpos',\n description: trim(`\n strpos(string, search_string)\n\n Alias for instr.\n `),\n url: `${duck}/text#instrstring-search_string`,\n args: [\n ['string', 'string'],\n ['search_string', 'string'],\n ],\n returns: 'number',\n },\n {\n name: 'substr',\n description: trim(`\n substr(string, start, length)\n\n Alias for substring.\n `),\n url: `${duck}/text#substringstring-start-length`,\n args: [\n ['string', 'string'],\n ['start', 'number'],\n ['length', 'number?'],\n ],\n returns: 'string',\n },\n {\n name: 'substring',\n description: trim(`\n substring(string, start, length)\n\n Extracts substring starting from character start. If optional argument length is set, extracts a substring of length characters instead.\n `),\n url: `${duck}/text#substringstring-start-length`,\n args: [\n ['string', 'string'],\n ['start', 'number'],\n ['length', 'number?'],\n ],\n returns: 'string',\n },\n {\n name: 'trim',\n description: trim(`\n trim(string, characters)\n\n Removes any occurrences of any of the characters from either side of the string.\n `),\n url: `${duck}/text#trimstring-characters`,\n args: [\n ['string', 'string'],\n ['characters', 'string?'],\n ],\n returns: 'string',\n },\n {\n name: 'unicode',\n description: trim(`\n unicode(string)\n\n Returns an INTEGER representing the unicode codepoint of the first character in the string.\n `),\n url: `${duck}/text#unicodestring`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'upper',\n description: trim(`\n upper(string)\n\n Converts string to upper case.\n `),\n url: `${duck}/text#upperstring`,\n args: [['string', 'string']],\n returns: 'string',\n },\n\n // ============================================================================\n // Date Functions\n // https://duckdb.org/docs/stable/sql/functions/date.html\n // ============================================================================\n\n {\n name: 'date_add',\n description: trim(`\n date_add(date, interval)\n\n Add the interval to the date and return a DATETIME value.\n `),\n url: `${duck}/date#date_adddate-interval`,\n args: [\n ['date', 'date'],\n ['interval', 'interval'],\n ],\n returns: 'timestamp',\n },\n {\n name: 'date_diff',\n description: trim(`\n date_diff(part, startdate, enddate)\n\n The number of part boundaries between startdate and enddate.\n `),\n url: `${duck}/date#date_diffpart-startdate-enddate`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'startdate', type: ['date', 'timestamp']},\n {name: 'enddate', type: ['date', 'timestamp']},\n ],\n returns: 'number',\n },\n {\n name: 'date_part',\n description: trim(`\n date_part(part, date)\n\n Get subfield (equivalent to extract).\n `),\n url: `${duck}/date#date_partpart-date`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'date', type: ['date', 'timestamp']},\n ],\n returns: 'number',\n metadata: args => inferTimeOrdinal(args[0]?.sql, 'duckdb'),\n },\n {\n name: 'year',\n description: trim(`\n year(date)\n\n Extracts the year.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('year', 'duckdb'),\n },\n {\n name: 'quarter',\n description: trim(`\n quarter(date)\n\n Extracts the quarter.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('quarter', 'duckdb'),\n },\n {\n name: 'month',\n description: trim(`\n month(date)\n\n Extracts the month.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('month', 'duckdb'),\n },\n {\n name: 'week',\n description: trim(`\n week(date)\n\n Extracts the week number.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('week', 'duckdb'),\n },\n {\n name: 'weekofyear',\n description: trim(`\n weekofyear(date)\n\n Extracts the ISO week number.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('weekofyear', 'duckdb'),\n },\n {\n name: 'day',\n description: trim(`\n day(date)\n\n Extracts the day of month.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('day', 'duckdb'),\n },\n {\n name: 'dayofmonth',\n description: trim(`\n dayofmonth(date)\n\n Extracts the day of month.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('dayofmonth', 'duckdb'),\n },\n {\n name: 'dayofweek',\n description: trim(`\n dayofweek(date)\n\n Extracts the day of week.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('dayofweek', 'duckdb'),\n },\n {\n name: 'weekday',\n description: trim(`\n weekday(date)\n\n Extracts the day of week.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('weekday', 'duckdb'),\n },\n {\n name: 'dayofyear',\n description: trim(`\n dayofyear(date)\n\n Extracts the day of year.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('dayofyear', 'duckdb'),\n },\n {\n name: 'hour',\n description: trim(`\n hour(date)\n\n Extracts the hour.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('hour', 'duckdb'),\n },\n {\n name: 'minute',\n description: trim(`\n minute(date)\n\n Extracts the minute.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('minute', 'duckdb'),\n },\n {\n name: 'second',\n description: trim(`\n second(date)\n\n Extracts the second.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('second', 'duckdb'),\n },\n {\n name: 'isodow',\n description: trim(`\n isodow(date)\n\n Extracts the ISO day of week.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('isodow', 'duckdb'),\n },\n {\n name: 'isoyear',\n description: trim(`\n isoyear(date)\n\n Extracts the ISO year.\n `),\n url: `${duck}/datepart.html`,\n args: [{name: 'date', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('isoyear', 'duckdb'),\n },\n {\n name: 'date_sub',\n description: trim(`\n date_sub(part, startdate, enddate)\n\n The signed length of the interval between startdate and enddate, truncated to whole multiples of part.\n `),\n url: `${duck}/date#date_subpart-startdate-enddate`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'startdate', type: ['date', 'timestamp']},\n {name: 'enddate', type: ['date', 'timestamp']},\n ],\n returns: 'number',\n },\n {\n name: 'dayname',\n description: trim(`\n dayname(date)\n\n The (English) name of the weekday.\n `),\n url: `${duck}/date#daynamedate`,\n args: [['date', 'date']],\n returns: 'string',\n },\n {\n name: 'last_day',\n description: trim(`\n last_day(date)\n\n The last day of the corresponding month in the date.\n `),\n url: `${duck}/date#last_daydate`,\n args: [['date', 'date']],\n returns: 'date',\n },\n {\n name: 'make_date',\n description: trim(`\n make_date(year, month, day)\n\n The date for the given parts.\n `),\n url: `${duck}/date#make_dateyear-month-day`,\n args: [\n ['year', 'number'],\n ['month', 'number'],\n ['day', 'number'],\n ],\n returns: 'date',\n },\n {\n name: 'monthname',\n description: trim(`\n monthname(date)\n\n The (English) name of the month.\n `),\n url: `${duck}/date#monthnamedate`,\n args: [['date', 'date']],\n returns: 'string',\n },\n {\n name: 'strftime',\n description: trim(`\n strftime(timestamp, format)\n\n Converts a timestamp to a string according to the format string.\n `),\n url: `${duck}/date#strftimedate-format`,\n args: [\n ['timestamp', 'timestamp'],\n ['format', 'string'],\n ],\n returns: 'string',\n },\n {\n name: 'today',\n description: trim(`\n today()\n\n Current date (start of current transaction) in the local time zone.\n `),\n url: `${duck}/date#today`,\n args: [],\n returns: 'date',\n },\n\n // ============================================================================\n // Timestamp Functions\n // https://duckdb.org/docs/stable/sql/functions/timestamp.html\n // ============================================================================\n\n {\n name: 'age',\n description: trim(`\n age(timestamp, timestamp)\n\n Subtract arguments, resulting in the time difference between the two timestamps.\n `),\n url: `${duck}/timestamp#agetimestamp-timestamp`,\n args: [\n ['timestamp1', 'timestamp'],\n ['timestamp2', 'timestamp?'],\n ],\n returns: 'interval',\n },\n {\n name: 'century',\n description: trim(`\n century(timestamp)\n\n Extracts the century of a timestamp.\n `),\n url: `${duck}/timestamp#centurytimestamp`,\n args: [['timestamp', 'timestamp']],\n returns: 'number',\n },\n {\n name: 'epoch',\n description: trim(`\n epoch(timestamp)\n\n Returns the total number of seconds since the epoch.\n `),\n url: `${duck}/timestamp#epochtimestamp`,\n args: [['timestamp', 'timestamp']],\n returns: 'number',\n },\n {\n name: 'epoch_ms',\n description: trim(`\n epoch_ms(timestamp)\n\n Returns the total number of milliseconds since the epoch.\n `),\n url: `${duck}/timestamp#epoch_mstimestamp`,\n args: [['timestamp', 'timestamp']],\n returns: 'number',\n },\n {\n name: 'epoch_ns',\n description: trim(`\n epoch_ns(timestamp)\n\n Returns the total number of nanoseconds since the epoch.\n `),\n url: `${duck}/timestamp#epoch_nstimestamp`,\n args: [['timestamp', 'timestamp']],\n returns: 'number',\n },\n {\n name: 'epoch_us',\n description: trim(`\n epoch_us(timestamp)\n\n Returns the total number of microseconds since the epoch.\n `),\n url: `${duck}/timestamp#epoch_ustimestamp`,\n args: [['timestamp', 'timestamp']],\n returns: 'number',\n },\n {\n name: 'make_timestamp',\n description: trim(`\n make_timestamp(year, month, day, hour, minute, second)\n\n The timestamp for the given parts.\n `),\n url: `${duck}/timestamp#make_timestampbigint-bigint-bigint-bigint-bigint-double`,\n args: [\n ['year', 'number'],\n ['month', 'number'],\n ['day', 'number'],\n ['hour', 'number'],\n ['minute', 'number'],\n ['second', 'number'],\n ],\n returns: 'timestamp',\n },\n {\n name: 'now',\n description: trim(`\n now()\n\n Current date and time (start of current transaction).\n `),\n url: `${duck}/timestamp#current_localtimestamp`,\n args: [],\n returns: 'timestamp',\n },\n {\n name: 'strptime',\n description: trim(`\n strptime(text, format)\n\n Converts the string text to timestamp according to the format string.\n `),\n url: `${duck}/timestamp#strptimetext-format`,\n args: [\n ['text', 'string'],\n ['format', 'string'],\n ],\n returns: 'timestamp',\n },\n {\n name: 'time_bucket',\n description: trim(`\n time_bucket(bucket_width, timestamp)\n\n Truncate timestamp to a grid of width bucket_width.\n `),\n url: `${duck}/timestamp#time_bucketbucket_width-timestamp-offset`,\n args: [\n ['bucket_width', 'interval'],\n ['timestamp', 'timestamp'],\n ],\n returns: 'timestamp',\n },\n\n // ============================================================================\n // Utility Functions\n // ============================================================================\n\n {\n name: 'coalesce',\n description: trim(`\n coalesce(expr, ...)\n\n Returns the first non-null expression from the list. If all are null, returns null.\n `),\n url: `${duck}/utility`,\n args: [{name: 'expressions', type: 'T...'}],\n returns: 'T',\n },\n {\n name: 'ifnull',\n description: trim(`\n ifnull(expr, alt)\n\n Returns expr if it is not null, otherwise returns alt.\n `),\n url: `${duck}/utility`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'alt', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'nullif',\n description: trim(`\n nullif(expr1, expr2)\n\n Returns null if expr1 equals expr2, otherwise returns expr1.\n `),\n url: `${duck}/utility`,\n args: [\n {name: 'expr1', type: 'T'},\n {name: 'expr2', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'typeof',\n description: trim(`\n typeof(expression)\n\n Returns the name of the data type of the result of the expression.\n `),\n url: `${duck}/utility`,\n args: [{name: 'expression', type: 'any'}],\n returns: 'string',\n },\n {\n name: 'hash',\n description: trim(`\n hash(value)\n\n Returns a UBIGINT with the hash of the value. Note that this is not a cryptographic hash.\n `),\n url: `${duck}/text#hashvalue-`,\n args: [{name: 'value', type: 'any'}],\n returns: 'number',\n },\n\n // ============================================================================\n // Date/Time Functions (additional)\n // ============================================================================\n\n {\n name: 'date_trunc',\n description: trim(`\n date_trunc(part, timestamp)\n\n Truncate to specified precision.\n `),\n url: `${duck}/timestamp#date_truncpart-timestamp`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'timestamp', type: ['date', 'timestamp']},\n ],\n returns: 'timestamp',\n metadata: args => inferGrain(args[0]?.sql),\n sqlTemplate: 'DATE_TRUNC(${part}, ${timestamp})',\n },\n {\n name: 'current_date',\n description: trim(`\n current_date\n\n Returns the current date.\n `),\n url: `${duck}/date#current_date`,\n args: [],\n returns: 'date',\n supportsBareInvocation: true,\n },\n {\n name: 'current_time',\n description: trim(`\n current_time\n\n Returns the current time.\n `),\n url: `${duck}/timestamp#current_time`,\n args: [],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n {\n name: 'current_timestamp',\n description: trim(`\n current_timestamp([precision])\n\n Returns the current timestamp (start of current transaction). Optional precision specifies the number of fractional digits.\n `),\n url: `${duck}/timestamp#current_localtimestamp`,\n args: [{name: 'precision', type: 'number?'}],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n {\n name: 'local_timestamp',\n description: trim(`\n localtimestamp\n\n Returns the current timestamp (start of current transaction) in the local time zone.\n `),\n url: `${duck}/timestamp#current_localtimestamp`,\n args: [],\n returns: 'timestamp',\n sqlName: 'LOCALTIMESTAMP',\n aliases: ['localtimestamp'],\n supportsBareInvocation: true,\n },\n {\n name: 'localtime',\n description: trim(`\n localtime\n\n Returns the current time in the local time zone.\n `),\n url: `${duck}/timestamp#current_time`,\n args: [],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n\n // ============================================================================\n // Conditional Functions\n // ============================================================================\n\n {\n name: 'if',\n description: trim(`\n if(condition, trueValue, falseValue)\n\n Returns trueValue if condition is true, otherwise returns falseValue.\n `),\n url: `${duck}/utility`,\n args: [\n {name: 'condition', type: 'boolean'},\n {name: 'trueValue', type: 'T'},\n {name: 'falseValue', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'count_if',\n description: trim(`\n count_if(condition)\n\n Returns the number of rows where condition is true.\n `),\n url: `${duck}/aggregates#count_ifcondition`,\n args: [{name: 'condition', type: 'boolean'}],\n returns: 'number',\n aggregate: true,\n },\n]\n", "// Snowflake SQL function definitions\n// These get converted to Malloy blueprints in functions.ts\n//\n// Documentation is copied verbatim from:\n// https://docs.snowflake.com/en/sql-reference/functions/\n\nimport type {FunctionDef} from './functionTypes.ts'\n\nimport {inferTimeOrdinal, inferGrain} from './temporalMetadata.ts'\nimport {trimIndentation} from './util.ts'\n\nconst sf = 'https://docs.snowflake.com/en/sql-reference/functions'\n\n// Helper to trim and dedent multiline strings\nconst trim = trimIndentation\n\nexport const snowflakeFunctions: FunctionDef[] = [\n // ============================================================================\n // Window Functions\n // https://docs.snowflake.com/en/sql-reference/functions-window\n // ============================================================================\n {\n name: 'row_number',\n description: trim('ROW_NUMBER() returns a unique row number for each row within the window partition.'),\n url: `${sf}/row_number`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'rank',\n description: trim('RANK() returns the rank of the current row with gaps for ties.'),\n url: `${sf}/rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'dense_rank',\n description: trim('DENSE_RANK() returns the rank of the current row without gaps.'),\n url: `${sf}/dense_rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'ntile',\n description: trim('NTILE(constant_value) divides rows into buckets and returns the bucket number.'),\n url: `${sf}/ntile`,\n args: [{name: 'constant_value', type: 'number'}],\n returns: 'number',\n window: true,\n },\n {\n name: 'lag',\n description: trim('LAG(expr, offset, default) accesses data from a previous row in the window.'),\n url: `${sf}/lag`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'lead',\n description: trim('LEAD(expr, offset, default) accesses data from a following row in the window.'),\n url: `${sf}/lead`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'offset', type: 'number?'},\n {name: 'default', type: 'T?'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'first_value',\n description: trim('FIRST_VALUE(expr) returns the first value in the window frame.'),\n url: `${sf}/first_value`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'last_value',\n description: trim('LAST_VALUE(expr) returns the last value in the window frame.'),\n url: `${sf}/last_value`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n window: true,\n },\n {\n name: 'nth_value',\n description: trim('NTH_VALUE(expr, n) returns the nth value in the window frame.'),\n url: `${sf}/nth_value`,\n args: [\n {name: 'expr', type: 'T'},\n {name: 'n', type: 'number'},\n ],\n returns: 'T',\n window: true,\n },\n {\n name: 'percent_rank',\n description: trim('PERCENT_RANK() returns the relative rank of the current row.'),\n url: `${sf}/percent_rank`,\n args: [],\n returns: 'number',\n window: true,\n },\n {\n name: 'cume_dist',\n description: trim('CUME_DIST() returns the cumulative distribution value for the current row.'),\n url: `${sf}/cume_dist`,\n args: [],\n returns: 'number',\n window: true,\n },\n\n // ============================================================================\n // Aggregate Functions\n // https://docs.snowflake.com/en/sql-reference/functions-aggregation\n // ============================================================================\n\n {\n name: 'any_value',\n description: trim(`\n ANY_VALUE( [ DISTINCT ] <expr> )\n\n Returns any value from a set of values. This function is non-deterministic. When used with DISTINCT, any distinct value is returned.\n\n Returns NULL if all input values are NULL.\n `),\n url: `${sf}/any_value`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'array_agg',\n description: trim(`\n ARRAY_AGG( [ DISTINCT ] <expr> ) [ WITHIN GROUP ( <orderby_clause> ) ]\n\n Returns the input values, pivoted into an ARRAY. If the input is empty, an empty ARRAY is returned.\n `),\n url: `${sf}/array_agg`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'array',\n aggregate: true,\n },\n {\n name: 'avg',\n description: trim(`\n AVG( [ DISTINCT ] <expr> )\n\n Returns the average of non-NULL records. If all records inside a group are NULL, the function returns NULL.\n `),\n url: `${sf}/avg`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'corr',\n description: trim(`\n CORR( <dependent>, <independent> )\n\n Returns the correlation coefficient for non-NULL pairs in a group.\n `),\n url: `${sf}/corr`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'count',\n description: trim(`\n COUNT( [ DISTINCT ] <expr> )\n COUNT(*)\n\n Returns the number of records that are not NULL, or the total number of records if using COUNT(*).\n\n If all records inside a group are NULL, the function returns 0.\n `),\n url: `${sf}/count`,\n args: [{name: 'expr', type: 'any?'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'count_if',\n description: trim(`\n COUNT_IF( <condition> )\n\n Returns the number of records that satisfy a condition.\n `),\n url: `${sf}/count_if`,\n args: [{name: 'condition', type: 'boolean'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'covar_pop',\n description: trim(`\n COVAR_POP( <dependent>, <independent> )\n\n Returns the population covariance for non-NULL pairs in a group.\n `),\n url: `${sf}/covar_pop`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'covar_samp',\n description: trim(`\n COVAR_SAMP( <dependent>, <independent> )\n\n Returns the sample covariance for non-NULL pairs in a group.\n `),\n url: `${sf}/covar_samp`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'listagg',\n description: trim(`\n LISTAGG( [ DISTINCT ] <expr> [, <delimiter>] ) [ WITHIN GROUP ( <orderby_clause> ) ]\n\n Returns the concatenated input values, separated by the delimiter string.\n `),\n url: `${sf}/listagg`,\n args: [\n {name: 'expr', type: 'string'},\n {name: 'delimiter', type: 'string?'},\n ],\n returns: 'string',\n aggregate: true,\n },\n {\n name: 'max',\n description: trim(`\n MAX( <expr> )\n\n Returns the maximum value for the records within expr. NULL values are ignored unless all the records are NULL, in which case a NULL value is returned.\n `),\n url: `${sf}/max`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'max_by',\n description: trim(`\n MAX_BY( <value_expr>, <order_expr> )\n\n Returns the value of value_expr that is associated with the maximum value of order_expr in a group.\n `),\n url: `${sf}/max_by`,\n args: [\n {name: 'value_expr', type: 'T'},\n {name: 'order_expr', type: 'any'},\n ],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'median',\n description: trim(`\n MEDIAN( <expr> )\n\n Returns the median value for the records in expr. NULL values are ignored.\n `),\n url: `${sf}/median`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'min',\n description: trim(`\n MIN( <expr> )\n\n Returns the minimum value for the records within expr. NULL values are ignored unless all the records are NULL, in which case a NULL value is returned.\n `),\n url: `${sf}/min`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'min_by',\n description: trim(`\n MIN_BY( <value_expr>, <order_expr> )\n\n Returns the value of value_expr that is associated with the minimum value of order_expr in a group.\n `),\n url: `${sf}/min_by`,\n args: [\n {name: 'value_expr', type: 'T'},\n {name: 'order_expr', type: 'any'},\n ],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'mode',\n description: trim(`\n MODE( <expr> )\n\n Returns the most frequent value for the records in expr. NULL values are ignored. If all the values are NULL, or there are 0 rows, then the function returns NULL.\n `),\n url: `${sf}/mode`,\n args: [{name: 'expr', type: 'T'}],\n returns: 'T',\n aggregate: true,\n },\n {\n name: 'stddev',\n description: trim(`\n STDDEV( [ DISTINCT ] <expr> )\n\n Returns the sample standard deviation (square root of sample variance) of non-NULL values. STDDEV is an alias for STDDEV_SAMP.\n `),\n url: `${sf}/stddev`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'stddev_samp',\n description: trim(`\n STDDEV_SAMP( [ DISTINCT ] <expr> )\n\n Returns the sample standard deviation (square root of sample variance) of non-NULL values.\n `),\n url: `${sf}/stddev`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'stddev_pop',\n description: trim(`\n STDDEV_POP( [ DISTINCT ] <expr> )\n\n Returns the population standard deviation (square root of population variance) of non-NULL values.\n `),\n url: `${sf}/stddev_pop`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'sum',\n description: trim(`\n SUM( [ DISTINCT ] <expr> )\n\n Returns the sum of non-NULL records for expr. You can use the DISTINCT keyword to compute the sum of unique non-null values. If all records inside a group are NULL, the function returns NULL.\n `),\n url: `${sf}/sum`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'var_pop',\n description: trim(`\n VAR_POP( [ DISTINCT ] <expr> )\n\n Returns the population variance of non-NULL records in a group. If all records inside a group are NULL, a NULL is returned.\n `),\n url: `${sf}/var_pop`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'var_samp',\n description: trim(`\n VAR_SAMP( [ DISTINCT ] <expr> )\n\n Returns the sample variance of non-NULL records in a group. If all records inside a group are NULL, a NULL is returned.\n `),\n url: `${sf}/var_samp`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'variance',\n description: trim(`\n VARIANCE( [ DISTINCT ] <expr> )\n\n Returns the sample variance of non-NULL records in a group. VARIANCE is an alias for VAR_SAMP.\n `),\n url: `${sf}/variance`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n\n // Bitwise Aggregation\n {\n name: 'bitand_agg',\n description: trim(`\n BITAND_AGG( <expr> )\n\n Returns the bitwise AND of all non-NULL numeric input values.\n `),\n url: `${sf}/bitand_agg`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bitor_agg',\n description: trim(`\n BITOR_AGG( <expr> )\n\n Returns the bitwise OR of all non-NULL numeric input values.\n `),\n url: `${sf}/bitor_agg`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'bitxor_agg',\n description: trim(`\n BITXOR_AGG( <expr> )\n\n Returns the bitwise XOR of all non-NULL numeric input values.\n `),\n url: `${sf}/bitxor_agg`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n\n // Boolean Aggregation\n {\n name: 'booland_agg',\n description: trim(`\n BOOLAND_AGG( <expr> )\n\n Returns TRUE if all non-NULL input expressions are TRUE, otherwise FALSE.\n `),\n url: `${sf}/booland_agg`,\n args: [{name: 'expr', type: 'boolean'}],\n returns: 'boolean',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'boolor_agg',\n description: trim(`\n BOOLOR_AGG( <expr> )\n\n Returns TRUE if at least one non-NULL input expression is TRUE, otherwise FALSE.\n `),\n url: `${sf}/boolor_agg`,\n args: [{name: 'expr', type: 'boolean'}],\n returns: 'boolean',\n aggregate: true,\n fanoutSafe: true,\n },\n {\n name: 'boolxor_agg',\n description: trim(`\n BOOLXOR_AGG( <expr> )\n\n Returns TRUE if exactly one non-NULL input expression is TRUE, otherwise FALSE.\n `),\n url: `${sf}/boolxor_agg`,\n args: [{name: 'expr', type: 'boolean'}],\n returns: 'boolean',\n aggregate: true,\n },\n\n // Linear Regression\n {\n name: 'regr_avgx',\n description: trim(`\n REGR_AVGX( <dependent>, <independent> )\n\n Returns the average of the independent variable for non-NULL pairs.\n `),\n url: `${sf}/regr_avgx`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_avgy',\n description: trim(`\n REGR_AVGY( <dependent>, <independent> )\n\n Returns the average of the dependent variable for non-NULL pairs.\n `),\n url: `${sf}/regr_avgy`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_count',\n description: trim(`\n REGR_COUNT( <dependent>, <independent> )\n\n Returns the number of non-NULL pairs used to fit the regression line.\n `),\n url: `${sf}/regr_count`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_intercept',\n description: trim(`\n REGR_INTERCEPT( <dependent>, <independent> )\n\n Returns the y-intercept of the least-squares-fit linear equation determined by the (dependent, independent) pairs.\n `),\n url: `${sf}/regr_intercept`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_r2',\n description: trim(`\n REGR_R2( <dependent>, <independent> )\n\n Returns the coefficient of determination (also known as R-squared) for non-NULL pairs.\n `),\n url: `${sf}/regr_r2`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_slope',\n description: trim(`\n REGR_SLOPE( <dependent>, <independent> )\n\n Returns the slope of the least-squares-fit linear equation determined by the (dependent, independent) pairs.\n `),\n url: `${sf}/regr_slope`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_sxx',\n description: trim(`\n REGR_SXX( <dependent>, <independent> )\n\n Returns REGR_COUNT(dependent, independent) * VAR_POP(independent) for non-NULL pairs.\n `),\n url: `${sf}/regr_sxx`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_sxy',\n description: trim(`\n REGR_SXY( <dependent>, <independent> )\n\n Returns REGR_COUNT(dependent, independent) * COVAR_POP(dependent, independent) for non-NULL pairs.\n `),\n url: `${sf}/regr_sxy`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'regr_syy',\n description: trim(`\n REGR_SYY( <dependent>, <independent> )\n\n Returns REGR_COUNT(dependent, independent) * VAR_POP(dependent) for non-NULL pairs.\n `),\n url: `${sf}/regr_syy`,\n args: [\n {name: 'dependent', type: 'number'},\n {name: 'independent', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n\n // Statistics\n {\n name: 'kurtosis',\n description: trim(`\n KURTOSIS( <expr> )\n\n Returns the excess kurtosis of its argument. A NULL value is returned if there are fewer than 4 records in the group.\n `),\n url: `${sf}/kurtosis`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'skew',\n description: trim(`\n SKEW( <expr> )\n\n Returns the sample skewness of the values in a group. A NULL value is returned if there are fewer than 3 records in the group.\n `),\n url: `${sf}/skew`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n aggregate: true,\n },\n\n // Approximate Aggregation\n {\n name: 'approx_count_distinct',\n description: trim(`\n APPROX_COUNT_DISTINCT( <expr> )\n\n Uses HyperLogLog to return an approximation of the distinct cardinality of the input.\n `),\n url: `${sf}/approx_count_distinct`,\n args: [{name: 'expr', type: 'any'}],\n returns: 'number',\n aggregate: true,\n },\n {\n name: 'approx_percentile',\n description: trim(`\n APPROX_PERCENTILE( <expr>, <percentile> )\n\n Uses the t-Digest algorithm to return an approximation of the specified percentile.\n `),\n url: `${sf}/approx_percentile`,\n args: [\n {name: 'expr', type: 'number'},\n {name: 'percentile', type: 'number'},\n ],\n returns: 'number',\n aggregate: true,\n },\n\n // ============================================================================\n // Numeric Functions\n // https://docs.snowflake.com/en/sql-reference/functions-numeric\n // ============================================================================\n\n {\n name: 'abs',\n description: trim(`\n ABS( <num_expr> )\n\n Returns the absolute value of a numeric expression.\n `),\n url: `${sf}/abs`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'acos',\n description: trim(`\n ACOS( <real_expr> )\n\n Computes the inverse cosine (arc cosine) of its input; the result is a number in the interval [0, pi].\n `),\n url: `${sf}/acos`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'acosh',\n description: trim(`\n ACOSH( <real_expr> )\n\n Computes the inverse hyperbolic cosine of its input.\n `),\n url: `${sf}/acosh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'asin',\n description: trim(`\n ASIN( <real_expr> )\n\n Computes the inverse sine (arc sine) of its input; the result is a number in the interval [-pi/2, pi/2].\n `),\n url: `${sf}/asin`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'asinh',\n description: trim(`\n ASINH( <real_expr> )\n\n Computes the inverse hyperbolic sine of its input.\n `),\n url: `${sf}/asinh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'atan',\n description: trim(`\n ATAN( <real_expr> )\n\n Computes the inverse tangent (arc tangent) of its input; the result is a number in the interval [-pi/2, pi/2].\n `),\n url: `${sf}/atan`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'atan2',\n description: trim(`\n ATAN2( <y>, <x> )\n\n Computes the inverse tangent (arc tangent) of the ratio of its two arguments.\n `),\n url: `${sf}/atan2`,\n args: [\n ['y', 'number'],\n ['x', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'atanh',\n description: trim(`\n ATANH( <real_expr> )\n\n Computes the inverse hyperbolic tangent of its input.\n `),\n url: `${sf}/atanh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cbrt',\n description: trim(`\n CBRT( <real_expr> )\n\n Returns the cube root of a numeric expression.\n `),\n url: `${sf}/cbrt`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'ceil',\n description: trim(`\n CEIL( <input_expr> [, <scale_expr> ] )\n\n Returns values from input_expr rounded to the nearest equal or larger integer, or to the nearest equal or larger value with the specified number of places after the decimal point.\n `),\n url: `${sf}/ceil`,\n args: [\n ['x', 'number'],\n ['scale', 'number?'],\n ],\n returns: 'number',\n },\n {\n name: 'cos',\n description: trim(`\n COS( <real_expr> )\n\n Computes the cosine of its argument; the argument should be expressed in radians.\n `),\n url: `${sf}/cos`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cosh',\n description: trim(`\n COSH( <real_expr> )\n\n Computes the hyperbolic cosine of its argument.\n `),\n url: `${sf}/cosh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'cot',\n description: trim(`\n COT( <real_expr> )\n\n Computes the cotangent of its argument; the argument should be expressed in radians.\n `),\n url: `${sf}/cot`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'degrees',\n description: trim(`\n DEGREES( <real_expr> )\n\n Converts radians to degrees.\n `),\n url: `${sf}/degrees`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'div0',\n description: trim(`\n DIV0( <dividend>, <divisor> )\n\n Performs division like the division operator (/), but returns 0 when the divisor is 0 (rather than reporting an error).\n `),\n url: `${sf}/div0`,\n args: [\n ['dividend', 'number'],\n ['divisor', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'div0null',\n description: trim(`\n DIV0NULL( <dividend>, <divisor> )\n\n Performs division like the division operator (/), but returns NULL when the divisor is 0 or NULL (rather than reporting an error).\n `),\n url: `${sf}/div0null`,\n args: [\n ['dividend', 'number'],\n ['divisor', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'exp',\n description: trim(`\n EXP( <real_expr> )\n\n Computes Euler's number e raised to a floating-point value.\n `),\n url: `${sf}/exp`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'factorial',\n description: trim(`\n FACTORIAL( <integer_expr> )\n\n Computes the factorial of its input. The input must be an integer in the range 0 to 33.\n `),\n url: `${sf}/factorial`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'floor',\n description: trim(`\n FLOOR( <input_expr> [, <scale_expr> ] )\n\n Returns values from input_expr rounded to the nearest equal or smaller integer, or to the nearest equal or smaller value with the specified number of places after the decimal point.\n `),\n url: `${sf}/floor`,\n args: [\n ['x', 'number'],\n ['scale', 'number?'],\n ],\n returns: 'number',\n },\n {\n name: 'ln',\n description: trim(`\n LN( <real_expr> )\n\n Returns the natural logarithm of a numeric expression.\n `),\n url: `${sf}/ln`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'log',\n description: trim(`\n LOG( <base>, <expr> )\n\n Returns the logarithm of a numeric expression.\n `),\n url: `${sf}/log`,\n args: [\n ['base', 'number'],\n ['x', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'mod',\n description: trim(`\n MOD( <expr1>, <expr2> )\n\n Returns the remainder of expr1 divided by expr2.\n `),\n url: `${sf}/mod`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'pi',\n description: trim(`\n PI()\n\n Returns the value of pi, which is approximately 3.14159265358979323846.\n `),\n url: `${sf}/pi`,\n args: [],\n returns: 'number',\n },\n {\n name: 'pow',\n description: trim(`\n POW( <x>, <y> )\n POWER( <x>, <y> )\n\n Returns x raised to the power of y.\n `),\n url: `${sf}/pow`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'power',\n description: trim(`\n POWER( <x>, <y> )\n\n Returns x raised to the power of y. Alias for POW.\n `),\n url: `${sf}/pow`,\n args: [\n ['x', 'number'],\n ['y', 'number'],\n ],\n returns: 'number',\n },\n {\n name: 'radians',\n description: trim(`\n RADIANS( <real_expr> )\n\n Converts degrees to radians.\n `),\n url: `${sf}/radians`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'random',\n description: trim(`\n RANDOM( [<seed>] )\n\n Returns a pseudo-random 64-bit integer.\n `),\n url: `${sf}/random`,\n args: [{name: 'seed', type: 'number?'}],\n returns: 'number',\n },\n {\n name: 'round',\n description: trim(`\n ROUND( <input_expr> [, <scale_expr> ] [, <rounding_mode> ] )\n\n Returns rounded values for input_expr.\n `),\n url: `${sf}/round`,\n args: [\n ['x', 'number'],\n ['scale', 'number?'],\n ],\n returns: 'number',\n },\n {\n name: 'sign',\n description: trim(`\n SIGN( <num_expr> )\n\n Returns the sign of a numeric value: -1 for negative, 0 for zero, 1 for positive.\n `),\n url: `${sf}/sign`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sin',\n description: trim(`\n SIN( <real_expr> )\n\n Computes the sine of its argument; the argument should be expressed in radians.\n `),\n url: `${sf}/sin`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sinh',\n description: trim(`\n SINH( <real_expr> )\n\n Computes the hyperbolic sine of its argument.\n `),\n url: `${sf}/sinh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'sqrt',\n description: trim(`\n SQRT( <real_expr> )\n\n Returns the square root of a non-negative numeric expression.\n `),\n url: `${sf}/sqrt`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'square',\n description: trim(`\n SQUARE( <real_expr> )\n\n Returns the square of a numeric expression (i.e., the expression multiplied by itself).\n `),\n url: `${sf}/square`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'tan',\n description: trim(`\n TAN( <real_expr> )\n\n Computes the tangent of its argument; the argument should be expressed in radians.\n `),\n url: `${sf}/tan`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'tanh',\n description: trim(`\n TANH( <real_expr> )\n\n Computes the hyperbolic tangent of its argument.\n `),\n url: `${sf}/tanh`,\n args: [['x', 'number']],\n returns: 'number',\n },\n {\n name: 'trunc',\n description: trim(`\n TRUNC( <input_expr> [, <scale_expr> ] )\n TRUNCATE( <input_expr> [, <scale_expr> ] )\n\n Rounds the input expression down to the nearest (or equal) integer closer to zero, or to the nearest equal or smaller value with the specified number of places after the decimal point.\n `),\n url: `${sf}/trunc`,\n args: [\n ['x', 'number'],\n ['scale', 'number?'],\n ],\n returns: 'number',\n },\n {\n name: 'width_bucket',\n description: trim(`\n WIDTH_BUCKET( <expr>, <min_value>, <max_value>, <num_buckets> )\n\n Constructs equi-width histograms, in which the histogram range is divided into intervals of identical size, and returns the bucket number into which the value of an expression falls.\n `),\n url: `${sf}/width_bucket`,\n args: [\n {name: 'expr', type: 'number'},\n {name: 'min_value', type: 'number'},\n {name: 'max_value', type: 'number'},\n {name: 'num_buckets', type: 'number'},\n ],\n returns: 'number',\n },\n\n // ============================================================================\n // String Functions\n // https://docs.snowflake.com/en/sql-reference/functions-string\n // ============================================================================\n\n {\n name: 'ascii',\n description: trim(`\n ASCII( <string> )\n\n Returns the ASCII code for the first character of a string. If the string is empty, a value of 0 is returned.\n `),\n url: `${sf}/ascii`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'bit_length',\n description: trim(`\n BIT_LENGTH( <string_or_binary> )\n\n Returns the length of a string or binary value in bits.\n `),\n url: `${sf}/bit_length`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'chr',\n description: trim(`\n CHR( <integer> )\n CHAR( <integer> )\n\n Converts a Unicode code point (including 7-bit ASCII) into the character that matches the input Unicode.\n `),\n url: `${sf}/chr`,\n args: [['code_point', 'number']],\n returns: 'string',\n },\n {\n name: 'concat',\n description: trim(`\n CONCAT( <expr1> [ , <exprN> ... ] )\n\n Concatenates one or more strings, or concatenates one or more binary values. If any of the values is null, the result is also null.\n `),\n url: `${sf}/concat`,\n args: [{name: 'values', type: 'string...'}],\n returns: 'string',\n },\n {\n name: 'concat_ws',\n description: trim(`\n CONCAT_WS( <separator>, <expr1> [ , <exprN> ... ] )\n\n Concatenates two or more strings, or concatenates two or more binary values. A specified separator is placed between each of the values. If any of the values is null, the result is also null.\n `),\n url: `${sf}/concat_ws`,\n args: [\n {name: 'separator', type: 'string'},\n {name: 'values', type: 'string...'},\n ],\n returns: 'string',\n },\n {\n name: 'contains',\n description: trim(`\n CONTAINS( <expr1>, <expr2> )\n\n Returns true if expr1 contains expr2. Both expressions must be text or binary expressions.\n `),\n url: `${sf}/contains`,\n args: [\n ['string', 'string'],\n ['search_string', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'editdistance',\n description: trim(`\n EDITDISTANCE( <string1>, <string2> [ , <max_distance> ] )\n\n Computes the Levenshtein distance between two input strings. It is the number of single-character insertions, deletions, or substitutions needed to convert one string to another.\n `),\n url: `${sf}/editdistance`,\n args: [\n {name: 'string1', type: 'string'},\n {name: 'string2', type: 'string'},\n {name: 'max_distance', type: 'number?'},\n ],\n returns: 'number',\n },\n {\n name: 'endswith',\n description: trim(`\n ENDSWITH( <expr1>, <expr2> )\n\n Returns TRUE if expr1 ends with expr2. Both expressions must be text or binary expressions.\n `),\n url: `${sf}/endswith`,\n args: [\n ['string', 'string'],\n ['suffix', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'initcap',\n description: trim(`\n INITCAP( <expr> [, <delimiters> ] )\n\n Returns the input string with the first letter of each word in uppercase and the subsequent letters in lowercase.\n `),\n url: `${sf}/initcap`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'delimiters', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'insert',\n description: trim(`\n INSERT( <base_expr>, <position>, <length>, <insert_expr> )\n\n Replaces a substring of the specified length, starting at the specified position, with a new string or binary value.\n `),\n url: `${sf}/insert`,\n args: [\n {name: 'base_expr', type: 'string'},\n {name: 'position', type: 'number'},\n {name: 'length', type: 'number'},\n {name: 'insert_expr', type: 'string'},\n ],\n returns: 'string',\n },\n {\n name: 'left',\n description: trim(`\n LEFT( <string_expr>, <length_expr> )\n\n Returns a leftmost substring of its input.\n `),\n url: `${sf}/left`,\n args: [\n ['string', 'string'],\n ['length', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'length',\n description: trim(`\n LENGTH( <string_or_binary> )\n LEN( <string_or_binary> )\n\n Returns the length of an input string or binary value. For strings, the length is the number of characters, and UTF-8 characters are counted as a single character. For binary, the length is the number of bytes.\n `),\n url: `${sf}/length`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'lower',\n description: trim(`\n LOWER( <expr> )\n\n Returns the input string with all characters converted to lowercase.\n `),\n url: `${sf}/lower`,\n args: [['string', 'string']],\n returns: 'string',\n },\n {\n name: 'lpad',\n description: trim(`\n LPAD( <base>, <length_expr> [, <pad>] )\n\n Left-pads a string with characters from another string, or left-pads a binary value with bytes from another binary value.\n `),\n url: `${sf}/lpad`,\n args: [\n {name: 'base', type: 'string'},\n {name: 'length', type: 'number'},\n {name: 'pad', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'ltrim',\n description: trim(`\n LTRIM( <expr> [, <characters> ] )\n\n Removes leading characters, including whitespace, from a string.\n `),\n url: `${sf}/ltrim`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'characters', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'octet_length',\n description: trim(`\n OCTET_LENGTH( <string_or_binary> )\n\n Returns the length of a string or binary value in bytes.\n `),\n url: `${sf}/octet_length`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'position',\n description: trim(`\n POSITION( <expr1> IN <expr2> [ FROM <position> ] )\n POSITION( <expr1>, <expr2> [, <position> ] )\n\n Searches for the first occurrence of the first argument in the second argument and, if successful, returns the position (1-based) of the first argument in the second argument.\n `),\n url: `${sf}/position`,\n args: [\n {name: 'search_string', type: 'string'},\n {name: 'string', type: 'string'},\n {name: 'position', type: 'number?'},\n ],\n returns: 'number',\n },\n {\n name: 'charindex',\n description: trim(`\n CHARINDEX( <expr1>, <expr2> [, <position> ] )\n\n Searches for the first occurrence of the first argument in the second argument and, if successful, returns the position (1-based) of the first argument in the second argument. Alias for POSITION.\n `),\n url: `${sf}/charindex`,\n args: [\n {name: 'search_string', type: 'string'},\n {name: 'string', type: 'string'},\n {name: 'position', type: 'number?'},\n ],\n returns: 'number',\n },\n {\n name: 'repeat',\n description: trim(`\n REPEAT( <input>, <n> )\n\n Builds a string by repeating the input for the specified number of times.\n `),\n url: `${sf}/repeat`,\n args: [\n ['input', 'string'],\n ['n', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'replace',\n description: trim(`\n REPLACE( <subject>, <pattern> [, <replacement> ] )\n\n Removes all occurrences of a specified substring, and optionally replaces them with another string.\n `),\n url: `${sf}/replace`,\n args: [\n {name: 'subject', type: 'string'},\n {name: 'pattern', type: 'string'},\n {name: 'replacement', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'reverse',\n description: trim(`\n REVERSE( <subject> )\n\n Reverses the order of characters in a string, or of bytes in a binary value.\n `),\n url: `${sf}/reverse`,\n args: [['subject', 'string']],\n returns: 'string',\n },\n {\n name: 'right',\n description: trim(`\n RIGHT( <string_expr>, <length_expr> )\n\n Returns a rightmost substring of its input.\n `),\n url: `${sf}/right`,\n args: [\n ['string', 'string'],\n ['length', 'number'],\n ],\n returns: 'string',\n },\n {\n name: 'rpad',\n description: trim(`\n RPAD( <base>, <length_expr> [, <pad>] )\n\n Right-pads a string with characters from another string, or right-pads a binary value with bytes from another binary value.\n `),\n url: `${sf}/rpad`,\n args: [\n {name: 'base', type: 'string'},\n {name: 'length', type: 'number'},\n {name: 'pad', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'rtrim',\n description: trim(`\n RTRIM( <expr> [, <characters> ] )\n\n Removes trailing characters, including whitespace, from a string.\n `),\n url: `${sf}/rtrim`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'characters', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'soundex',\n description: trim(`\n SOUNDEX( <varchar_expr> )\n\n Returns a string that contains a phonetic representation of the input string.\n `),\n url: `${sf}/soundex`,\n args: [['string', 'string']],\n returns: 'string',\n },\n {\n name: 'space',\n description: trim(`\n SPACE( <n> )\n\n Returns a string consisting of the specified number of blank spaces.\n `),\n url: `${sf}/space`,\n args: [['n', 'number']],\n returns: 'string',\n },\n {\n name: 'split',\n description: trim(`\n SPLIT( <string>, <delimiter> )\n\n Splits a given string with a given separator and returns the result in an array of strings.\n `),\n url: `${sf}/split`,\n args: [\n ['string', 'string'],\n ['delimiter', 'string'],\n ],\n returns: 'array',\n },\n {\n name: 'split_part',\n description: trim(`\n SPLIT_PART( <string>, <delimiter>, <part_number> )\n\n Splits a given string at a specified character or substring (the delimiter) and returns the requested part.\n `),\n url: `${sf}/split_part`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'delimiter', type: 'string'},\n {name: 'part_number', type: 'number'},\n ],\n returns: 'string',\n },\n {\n name: 'startswith',\n description: trim(`\n STARTSWITH( <expr1>, <expr2> )\n\n Returns TRUE if expr1 starts with expr2. Both expressions must be text or binary expressions.\n `),\n url: `${sf}/startswith`,\n args: [\n ['string', 'string'],\n ['prefix', 'string'],\n ],\n returns: 'boolean',\n },\n {\n name: 'substr',\n description: trim(`\n SUBSTR( <base_expr>, <start_expr> [, <length_expr>] )\n SUBSTRING( <base_expr>, <start_expr> [, <length_expr>] )\n\n Returns the portion of the string or binary value from base_expr, starting from the character/byte specified by start_expr, with optionally limited length.\n `),\n url: `${sf}/substr`,\n args: [\n {name: 'base_expr', type: 'string'},\n {name: 'start_expr', type: 'number'},\n {name: 'length_expr', type: 'number?'},\n ],\n returns: 'string',\n },\n {\n name: 'translate',\n description: trim(`\n TRANSLATE( <subject>, <sourceAlphabet>, <targetAlphabet> )\n\n Translates string from one alphabet to another.\n `),\n url: `${sf}/translate`,\n args: [\n {name: 'subject', type: 'string'},\n {name: 'source_alphabet', type: 'string'},\n {name: 'target_alphabet', type: 'string'},\n ],\n returns: 'string',\n },\n {\n name: 'trim',\n description: trim(`\n TRIM( <expr> [, <characters> ] )\n\n Removes leading and trailing characters from a string.\n `),\n url: `${sf}/trim`,\n args: [\n {name: 'string', type: 'string'},\n {name: 'characters', type: 'string?'},\n ],\n returns: 'string',\n },\n {\n name: 'unicode',\n description: trim(`\n UNICODE( <string> )\n\n Returns the Unicode code point for the first character of the input string.\n `),\n url: `${sf}/unicode`,\n args: [['string', 'string']],\n returns: 'number',\n },\n {\n name: 'upper',\n description: trim(`\n UPPER( <expr> )\n\n Returns the input string with all characters converted to uppercase.\n `),\n url: `${sf}/upper`,\n args: [['string', 'string']],\n returns: 'string',\n },\n {\n name: 'uuid_string',\n description: trim(`\n UUID_STRING( [ <uuid> | <string> ] )\n\n Generates either a version 4 (random) or version 5 (named) RFC 4122-compliant UUID as a formatted string.\n `),\n url: `${sf}/uuid_string`,\n args: [{name: 'input', type: 'string?'}],\n returns: 'string',\n },\n\n // Regular Expression Functions\n {\n name: 'regexp_count',\n description: trim(`\n REGEXP_COUNT( <subject>, <pattern> [, <position> [, <parameters> ]] )\n\n Returns the number of times that a pattern occurs in a string.\n `),\n url: `${sf}/regexp_count`,\n args: [\n {name: 'subject', type: 'string'},\n {name: 'pattern', type: 'string'},\n {name: 'position', type: 'number?'},\n {name: 'parameters', type: 'string?'},\n ],\n returns: 'number',\n },\n {\n name: 'regexp_instr',\n description: trim(`\n REGEXP_INSTR( <subject>, <pattern> [, <position> [, <occurrence> [, <option> [, <parameters> [, <group_num> ]]]]] )\n\n Returns the position of the specified occurrence of the regular expression pattern in the string subject.\n `),\n url: `${sf}/regexp_instr`,\n args: [\n {name: 'subject', type: 'string'},\n {name: 'pattern', type: 'string'},\n {name: 'position', type: 'number?'},\n {name: 'occurrence', type: 'number?'},\n ],\n returns: 'number',\n },\n {\n name: 'regexp_like',\n description: trim(`\n REGEXP_LIKE( <subject>, <pattern> [, <parameters> ] )\n\n Returns true if the subject matches the specified pattern. Both inputs must be text expressions.\n `),\n url: `${sf}/regexp_like`,\n args: [\n {name: 'subject', type: 'string'},\n {name: 'pattern', type: 'string'},\n {name: 'parameters', type: 'string?'},\n ],\n returns: 'boolean',\n },\n {\n name: 'regexp_replace',\n description: trim(`\n REGEXP_REPLACE( <subject>, <pattern> [, <replacement> [, <position> [, <occurrence> [, <parameters> ]]]] )\n\n Returns the subject with the specified pattern (or all occurrences of the pattern) either removed or replaced by a replacement string.\n `),\n url: `${sf}/regexp_replace`,\n args: [\n {name: 'subject', type: 'string'},\n {name: 'pattern', type: 'string'},\n {name: 'replacement', type: 'string?'},\n {name: 'position', type: 'number?'},\n {name: 'occurrence', type: 'number?'},\n ],\n returns: 'string',\n },\n {\n name: 'regexp_substr',\n description: trim(`\n REGEXP_SUBSTR( <subject>, <pattern> [, <position> [, <occurrence> [, <parameters> [, <group_num> ]]]] )\n\n Returns the substring that matches a regular expression within a string.\n `),\n url: `${sf}/regexp_substr`,\n args: [\n {name: 'subject', type: 'string'},\n {name: 'pattern', type: 'string'},\n {name: 'position', type: 'number?'},\n {name: 'occurrence', type: 'number?'},\n ],\n returns: 'string',\n },\n\n // Hash Functions\n {\n name: 'md5',\n description: trim(`\n MD5( <msg> )\n MD5_HEX( <msg> )\n\n Returns a 32-character hex-encoded string containing the 128-bit MD5 message digest.\n `),\n url: `${sf}/md5`,\n args: [['msg', 'string']],\n returns: 'string',\n },\n {\n name: 'md5_binary',\n description: trim(`\n MD5_BINARY( <msg> )\n\n Returns a 16-byte BINARY value containing the 128-bit MD5 message digest.\n `),\n url: `${sf}/md5_binary`,\n args: [['msg', 'string']],\n returns: 'string',\n },\n {\n name: 'sha1',\n description: trim(`\n SHA1( <msg> )\n SHA1_HEX( <msg> )\n\n Returns a 40-character hex-encoded string containing the 160-bit SHA-1 message digest.\n `),\n url: `${sf}/sha1`,\n args: [['msg', 'string']],\n returns: 'string',\n },\n {\n name: 'sha1_binary',\n description: trim(`\n SHA1_BINARY( <msg> )\n\n Returns a 20-byte BINARY value containing the 160-bit SHA-1 message digest.\n `),\n url: `${sf}/sha1_binary`,\n args: [['msg', 'string']],\n returns: 'string',\n },\n {\n name: 'sha2',\n description: trim(`\n SHA2( <msg> [, <digest_size>] )\n SHA2_HEX( <msg> [, <digest_size>] )\n\n Returns a hex-encoded string containing the SHA-2 message digest.\n `),\n url: `${sf}/sha2`,\n args: [\n {name: 'msg', type: 'string'},\n {name: 'digest_size', type: 'number?'},\n ],\n returns: 'string',\n },\n {\n name: 'sha2_binary',\n description: trim(`\n SHA2_BINARY( <msg> [, <digest_size>] )\n\n Returns a BINARY value containing the SHA-2 message digest.\n `),\n url: `${sf}/sha2_binary`,\n args: [\n {name: 'msg', type: 'string'},\n {name: 'digest_size', type: 'number?'},\n ],\n returns: 'string',\n },\n {\n name: 'hash',\n description: trim(`\n HASH( <expr> [, <expr2> ... ] )\n\n Returns a signed 64-bit hash value. Note that HASH is not a cryptographic hash function.\n `),\n url: `${sf}/hash`,\n args: [{name: 'expressions', type: 'any...'}],\n returns: 'number',\n },\n\n // ============================================================================\n // Date & Time Functions\n // https://docs.snowflake.com/en/sql-reference/functions-date-time\n // ============================================================================\n\n {\n name: 'add_months',\n description: trim(`\n ADD_MONTHS( <date_or_timestamp_expr>, <num_months_expr> )\n\n Adds or subtracts a specified number of months to a date or timestamp.\n `),\n url: `${sf}/add_months`,\n args: [\n {name: 'date_expr', type: ['date', 'timestamp']},\n {name: 'num_months', type: 'number'},\n ],\n returns: 'date',\n },\n {\n name: 'date_from_parts',\n description: trim(`\n DATE_FROM_PARTS( <year>, <month>, <day> )\n\n Creates a date from individual numeric components that represent the year, month, and day of the month.\n `),\n url: `${sf}/date_from_parts`,\n args: [\n {name: 'year', type: 'number'},\n {name: 'month', type: 'number'},\n {name: 'day', type: 'number'},\n ],\n returns: 'date',\n },\n {\n name: 'date_part',\n description: trim(`\n DATE_PART( <date_or_time_part>, <date_or_time_expr> )\n\n Extracts the specified date or time part from a date, time, or timestamp.\n `),\n url: `${sf}/date_part`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'date_expr', type: ['date', 'timestamp']},\n ],\n returns: 'number',\n metadata: args => inferTimeOrdinal(args[0]?.sql, 'snowflake'),\n },\n {\n name: 'dateadd',\n description: trim(`\n DATEADD( <date_or_time_part>, <value>, <date_or_time_expr> )\n\n Adds the specified value for the specified date or time part to a date, time, or timestamp.\n `),\n url: `${sf}/dateadd`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'value', type: 'number'},\n {name: 'date_expr', type: ['date', 'timestamp']},\n ],\n returns: 'timestamp',\n },\n {\n name: 'datediff',\n description: trim(`\n DATEDIFF( <date_or_time_part>, <date_or_time_expr1>, <date_or_time_expr2> )\n\n Calculates the difference between two date, time, or timestamp expressions based on the specified date or time part.\n `),\n url: `${sf}/datediff`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'date_expr1', type: ['date', 'timestamp']},\n {name: 'date_expr2', type: ['date', 'timestamp']},\n ],\n returns: 'number',\n },\n {\n name: 'dayname',\n description: trim(`\n DAYNAME( <date_or_timestamp_expr> )\n\n Extracts the three-letter day-of-week name from the specified date or timestamp.\n `),\n url: `${sf}/dayname`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'string',\n },\n {\n name: 'last_day',\n description: trim(`\n LAST_DAY( <date_or_time_expr> [, <date_part> ] )\n\n Returns the last day of the specified date part for a date or timestamp.\n `),\n url: `${sf}/last_day`,\n args: [\n {name: 'date_expr', type: ['date', 'timestamp']},\n {name: 'date_part', type: 'string?'},\n ],\n returns: 'date',\n },\n {\n name: 'monthname',\n description: trim(`\n MONTHNAME( <date_or_timestamp_expr> )\n\n Extracts the three-letter month name from the specified date or timestamp.\n `),\n url: `${sf}/monthname`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'string',\n },\n {\n name: 'months_between',\n description: trim(`\n MONTHS_BETWEEN( <date_expr1>, <date_expr2> )\n\n Returns the number of months between two DATE or TIMESTAMP values.\n `),\n url: `${sf}/months_between`,\n args: [\n {name: 'date_expr1', type: ['date', 'timestamp']},\n {name: 'date_expr2', type: ['date', 'timestamp']},\n ],\n returns: 'number',\n },\n {\n name: 'next_day',\n description: trim(`\n NEXT_DAY( <date_or_timestamp_expr>, <dow_string> )\n\n Returns the date of the first specified day of the week that occurs after the input date.\n `),\n url: `${sf}/next_day`,\n args: [\n {name: 'date_expr', type: ['date', 'timestamp']},\n {name: 'dow_string', type: 'string'},\n ],\n returns: 'date',\n },\n {\n name: 'previous_day',\n description: trim(`\n PREVIOUS_DAY( <date_or_timestamp_expr>, <dow_string> )\n\n Returns the date of the first specified day of the week that occurs before the input date.\n `),\n url: `${sf}/previous_day`,\n args: [\n {name: 'date_expr', type: ['date', 'timestamp']},\n {name: 'dow_string', type: 'string'},\n ],\n returns: 'date',\n },\n {\n name: 'time_from_parts',\n description: trim(`\n TIME_FROM_PARTS( <hour>, <minute>, <second> [, <nanosecond>] )\n\n Creates a time from individual numeric components.\n `),\n url: `${sf}/time_from_parts`,\n args: [\n {name: 'hour', type: 'number'},\n {name: 'minute', type: 'number'},\n {name: 'second', type: 'number'},\n {name: 'nanosecond', type: 'number?'},\n ],\n returns: 'timestamp',\n },\n {\n name: 'time_slice',\n description: trim(`\n TIME_SLICE( <date_or_time_expr>, <slice_length>, <date_or_time_part> [, <start_or_end> ] )\n\n Calculates the beginning or end of a time slice, which is a period of time.\n `),\n url: `${sf}/time_slice`,\n args: [\n {name: 'date_or_time_expr', type: ['date', 'timestamp']},\n {name: 'slice_length', type: 'number'},\n {name: 'date_or_time_part', type: 'string'},\n ],\n returns: 'timestamp',\n metadata: args => inferGrain(args[2]?.sql),\n },\n {\n name: 'timestamp_from_parts',\n description: trim(`\n TIMESTAMP_FROM_PARTS( <year>, <month>, <day>, <hour>, <minute>, <second> [, <nanosecond>] [, <time_zone>] )\n\n Creates a timestamp from individual numeric components.\n `),\n url: `${sf}/timestamp_from_parts`,\n args: [\n {name: 'year', type: 'number'},\n {name: 'month', type: 'number'},\n {name: 'day', type: 'number'},\n {name: 'hour', type: 'number'},\n {name: 'minute', type: 'number'},\n {name: 'second', type: 'number'},\n {name: 'nanosecond', type: 'number?'},\n ],\n returns: 'timestamp',\n },\n {\n name: 'convert_timezone',\n description: trim(`\n CONVERT_TIMEZONE( [<source_tz>,] <target_tz>, <source_timestamp_ntz> )\n\n Converts a timestamp to another time zone.\n `),\n url: `${sf}/convert_timezone`,\n args: [\n {name: 'source_tz', type: 'string?'},\n {name: 'target_tz', type: 'string'},\n {name: 'source_timestamp', type: 'timestamp'},\n ],\n returns: 'timestamp',\n },\n\n // Date extraction functions (commonly used as aliases for DATE_PART)\n {\n name: 'year',\n description: trim(`\n YEAR( <date_or_timestamp_expr> )\n\n Extracts the year from a date or timestamp. Equivalent to DATE_PART('year', ...).\n `),\n url: `${sf}/year`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('year', 'snowflake'),\n },\n {\n name: 'month',\n description: trim(`\n MONTH( <date_or_timestamp_expr> )\n\n Extracts the month from a date or timestamp. Equivalent to DATE_PART('month', ...).\n `),\n url: `${sf}/year`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('month', 'snowflake'),\n },\n {\n name: 'day',\n description: trim(`\n DAY( <date_or_timestamp_expr> )\n DAYOFMONTH( <date_or_timestamp_expr> )\n\n Extracts the day of month from a date or timestamp. Equivalent to DATE_PART('day', ...).\n `),\n url: `${sf}/year`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n aliases: ['dayofmonth'],\n metadata: inferTimeOrdinal('day', 'snowflake'),\n },\n {\n name: 'dayofweek',\n description: trim(`\n DAYOFWEEK( <date_or_timestamp_expr> )\n\n Extracts the day of the week from a date or timestamp.\n `),\n url: `${sf}/year`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('dayofweek', 'snowflake'),\n },\n {\n name: 'dayofyear',\n description: trim(`\n DAYOFYEAR( <date_or_timestamp_expr> )\n\n Extracts the day of the year from a date or timestamp.\n `),\n url: `${sf}/year`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('dayofyear', 'snowflake'),\n },\n {\n name: 'week',\n description: trim(`\n WEEK( <date_or_timestamp_expr> )\n WEEKOFYEAR( <date_or_timestamp_expr> )\n\n Extracts the week of the year from a date or timestamp.\n `),\n url: `${sf}/year`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n aliases: ['weekofyear'],\n metadata: inferTimeOrdinal('week', 'snowflake'),\n },\n {\n name: 'quarter',\n description: trim(`\n QUARTER( <date_or_timestamp_expr> )\n\n Extracts the quarter from a date or timestamp (1-4).\n `),\n url: `${sf}/year`,\n args: [{name: 'date_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('quarter', 'snowflake'),\n },\n {\n name: 'hour',\n description: trim(`\n HOUR( <time_or_timestamp_expr> )\n\n Extracts the hour (0-23) from a time or timestamp.\n `),\n url: `${sf}/hour-minute-second`,\n args: [{name: 'time_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('hour', 'snowflake'),\n },\n {\n name: 'minute',\n description: trim(`\n MINUTE( <time_or_timestamp_expr> )\n\n Extracts the minute (0-59) from a time or timestamp.\n `),\n url: `${sf}/hour-minute-second`,\n args: [{name: 'time_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('minute', 'snowflake'),\n },\n {\n name: 'second',\n description: trim(`\n SECOND( <time_or_timestamp_expr> )\n\n Extracts the second (0-59) from a time or timestamp.\n `),\n url: `${sf}/hour-minute-second`,\n args: [{name: 'time_expr', type: ['date', 'timestamp']}],\n returns: 'number',\n metadata: inferTimeOrdinal('second', 'snowflake'),\n },\n\n // ============================================================================\n // Conditional Functions\n // https://docs.snowflake.com/en/sql-reference/expressions-conditional\n // ============================================================================\n\n {\n name: 'coalesce',\n description: trim(`\n COALESCE( <expr1>, <expr2> [, <exprN> ... ] )\n\n Returns the first non-NULL expression among its arguments, or NULL if all its arguments are NULL.\n `),\n url: `${sf}/coalesce`,\n args: [{name: 'expressions', type: 'T...'}],\n returns: 'T',\n },\n {\n name: 'decode',\n description: trim(`\n DECODE( <expr>, <search1>, <result1> [, <search2>, <result2> ... ] [, <default> ] )\n\n Compares the select expression to each search expression in order. As soon as a search expression matches the selection expression, the corresponding result expression is returned.\n `),\n url: `${sf}/decode`,\n args: [\n {name: 'expr', type: 'any'},\n {name: 'search1', type: 'any'},\n {name: 'result1', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'equal_null',\n description: trim(`\n EQUAL_NULL( <expr1>, <expr2> )\n\n Compares whether two expressions are equal. The function is NULL-safe, meaning it treats NULLs as known values for comparing equality.\n `),\n url: `${sf}/equal_null`,\n args: [\n {name: 'expr1', type: 'any'},\n {name: 'expr2', type: 'any'},\n ],\n returns: 'boolean',\n },\n {\n name: 'greatest',\n description: trim(`\n GREATEST( <expr1> [, <expr2> ... ] )\n\n Returns the largest value from a list of expressions. NULL values are ignored. If all arguments are NULL, the result is NULL.\n `),\n url: `${sf}/greatest`,\n args: [{name: 'expressions', type: 'T...'}],\n returns: 'T',\n },\n {\n name: 'iff',\n description: trim(`\n IFF( <condition>, <expr1>, <expr2> )\n\n Single-level if-then-else expression. Similar to CASE, but only allows a single condition.\n `),\n url: `${sf}/iff`,\n args: [\n {name: 'condition', type: 'boolean'},\n {name: 'true_value', type: 'T'},\n {name: 'false_value', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'ifnull',\n description: trim(`\n IFNULL( <expr1>, <expr2> )\n\n If expr1 is NULL, returns expr2; otherwise, returns expr1.\n `),\n url: `${sf}/ifnull`,\n args: [\n {name: 'expr1', type: 'T'},\n {name: 'expr2', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'least',\n description: trim(`\n LEAST( <expr1> [, <expr2> ... ] )\n\n Returns the smallest value from a list of expressions. NULL values are ignored. If all arguments are NULL, the result is NULL.\n `),\n url: `${sf}/least`,\n args: [{name: 'expressions', type: 'T...'}],\n returns: 'T',\n },\n {\n name: 'nullif',\n description: trim(`\n NULLIF( <expr1>, <expr2> )\n\n Returns NULL if expr1 is equal to expr2, otherwise returns expr1.\n `),\n url: `${sf}/nullif`,\n args: [\n {name: 'expr1', type: 'T'},\n {name: 'expr2', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'nullifzero',\n description: trim(`\n NULLIFZERO( <expr> )\n\n Returns NULL if the argument evaluates to 0; otherwise, returns the argument.\n `),\n url: `${sf}/nullifzero`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n },\n {\n name: 'nvl',\n description: trim(`\n NVL( <expr1>, <expr2> )\n\n If expr1 is NULL, returns expr2; otherwise, returns expr1. Alias for IFNULL.\n `),\n url: `${sf}/nvl`,\n args: [\n {name: 'expr1', type: 'T'},\n {name: 'expr2', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'nvl2',\n description: trim(`\n NVL2( <expr1>, <expr2>, <expr3> )\n\n Returns expr2 if expr1 is not NULL, otherwise returns expr3.\n `),\n url: `${sf}/nvl2`,\n args: [\n {name: 'expr1', type: 'any'},\n {name: 'expr2', type: 'T'},\n {name: 'expr3', type: 'T'},\n ],\n returns: 'T',\n },\n {\n name: 'zeroifnull',\n description: trim(`\n ZEROIFNULL( <expr> )\n\n Returns 0 if the argument is NULL; otherwise, returns the argument.\n `),\n url: `${sf}/zeroifnull`,\n args: [{name: 'expr', type: 'number'}],\n returns: 'number',\n },\n\n // Boolean functions\n {\n name: 'booland',\n description: trim(`\n BOOLAND( <expr1>, <expr2> )\n\n Computes the Boolean AND of two numeric expressions.\n `),\n url: `${sf}/booland`,\n args: [\n {name: 'expr1', type: 'boolean'},\n {name: 'expr2', type: 'boolean'},\n ],\n returns: 'boolean',\n },\n {\n name: 'boolnot',\n description: trim(`\n BOOLNOT( <expr> )\n\n Computes the Boolean NOT of a numeric expression.\n `),\n url: `${sf}/boolnot`,\n args: [{name: 'expr', type: 'boolean'}],\n returns: 'boolean',\n },\n {\n name: 'boolor',\n description: trim(`\n BOOLOR( <expr1>, <expr2> )\n\n Computes the Boolean OR of two numeric expressions.\n `),\n url: `${sf}/boolor`,\n args: [\n {name: 'expr1', type: 'boolean'},\n {name: 'expr2', type: 'boolean'},\n ],\n returns: 'boolean',\n },\n {\n name: 'boolxor',\n description: trim(`\n BOOLXOR( <expr1>, <expr2> )\n\n Computes the Boolean XOR of two numeric expressions.\n `),\n url: `${sf}/boolxor`,\n args: [\n {name: 'expr1', type: 'boolean'},\n {name: 'expr2', type: 'boolean'},\n ],\n returns: 'boolean',\n },\n\n // ============================================================================\n // Utility Functions\n // ============================================================================\n\n {\n name: 'typeof',\n description: trim(`\n TYPEOF( <expr> )\n\n Reports the type of a value stored in a VARIANT column. The type is returned as a string.\n `),\n url: `${sf}/typeof`,\n args: [{name: 'expr', type: 'any'}],\n returns: 'string',\n },\n\n // ============================================================================\n // Date/Time Functions (additional)\n // ============================================================================\n\n {\n name: 'date_trunc',\n description: trim(`\n DATE_TRUNC( <date_or_time_part>, <date_or_time_expr> )\n\n Truncates a DATE, TIME, or TIMESTAMP to the specified precision.\n `),\n url: `${sf}/date_trunc`,\n args: [\n {name: 'part', type: 'string'},\n {name: 'date_expr', type: ['date', 'timestamp']},\n ],\n returns: 'timestamp',\n metadata: args => inferGrain(args[0]?.sql),\n sqlTemplate: 'DATE_TRUNC(${part}, ${date_expr})',\n },\n {\n name: 'current_date',\n description: trim(`\n CURRENT_DATE\n\n Returns the current date of the system.\n `),\n url: `${sf}/current_date`,\n args: [],\n returns: 'date',\n supportsBareInvocation: true,\n },\n {\n name: 'current_time',\n description: trim(`\n CURRENT_TIME\n\n Returns the current time of the system.\n `),\n url: `${sf}/current_time`,\n args: [],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n {\n name: 'current_timestamp',\n description: trim(`\n CURRENT_TIMESTAMP\n\n Returns the current timestamp of the system.\n `),\n url: `${sf}/current_timestamp`,\n args: [],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n {\n name: 'localtime',\n description: trim(`\n LOCALTIME\n\n Returns the current time in the session time zone.\n `),\n url: `${sf}/localtime`,\n args: [],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n {\n name: 'localtimestamp',\n description: trim(`\n LOCALTIMESTAMP\n\n Returns the current timestamp in the session time zone.\n `),\n url: `${sf}/localtimestamp`,\n args: [],\n returns: 'timestamp',\n supportsBareInvocation: true,\n },\n]\n", "import {type SyntaxNode} from '@lezer/common'\n\nimport type {Analyzer} from './analyze.ts'\nimport type {FunctionDef, ArgDef} from './functionTypes.ts'\n\nimport {bigQueryFunctions} from './bigQueryFunctions.ts'\nimport {clickHouseFunctions} from './clickHouseFunctions.ts'\nimport {duckDbFunctions} from './duckDbFunctions.ts'\nimport {extendFanoutPath, mergeFanoutPaths, mergeSensitiveFanouts, normalizeExprFanout} from './fanout.ts'\nimport {snowflakeFunctions} from './snowflakeFunctions.ts'\nimport {arrayOf, scalarType, type Expr, type FieldMeta, type FieldType, isArrayType, isScalarType, type Scope, type TypeKind} from './types.ts'\nimport {txt} from './util.ts'\n\n// The shape that analyzeFunction works with. Converted from FunctionDef at startup.\ninterface Overload {\n params: {name: string; allowedTypes: {type: TypeKind; rawType?: string}[]; isVariadic?: boolean}[]\n returnType: {type: FieldType | 'generic' | 'array'; expressionType?: 'aggregate' | 'scalar' | 'window'}\n fanoutSafe?: boolean\n sqlName?: string\n supportsBareInvocation?: boolean\n bareSqlName?: string\n metadata?: FunctionDef['metadata']\n}\n\n// Convert a FunctionDef arg type string (e.g. 'number', 'T', 'string...', 'kw') to allowedTypes\nfunction parseArgType(typeStr: string): {type: TypeKind; rawType?: string}[] {\n let base = typeStr.replace(/[?.]/g, '')\n if (base === 'kw') return [{type: 'sql native', rawType: 'kw'}]\n if (base === 'T' || base === 'any') return ['string', 'number', 'boolean', 'date', 'timestamp', 'json', 'array'].map(type => ({type: type as TypeKind}))\n if (base === 'array') return [{type: 'array'}]\n return [{type: base as TypeKind}]\n}\n\nfunction getArgInfo(arg: ArgDef): {name: string; type: string} {\n let [name, type] = Array.isArray(arg) ? [arg[0], arg[1]] : [arg.name, arg.type]\n return {name, type: Array.isArray(type) ? type[0] : type}\n}\n\nfunction parseArgTypes(arg: ArgDef): {type: TypeKind; rawType?: string}[] {\n let type = Array.isArray(arg) ? arg[1] : arg.type\n if (Array.isArray(type)) return type.map(t => ({type: t as TypeKind}))\n return parseArgType(type)\n}\n\n// Convert a FunctionDef into one or more Overloads (optional args expand into multiple overloads)\nfunction convertDef(def: FunctionDef): Overload[] {\n let expressionType: 'aggregate' | 'window' | 'scalar' = 'scalar'\n if (def.aggregate) expressionType = 'aggregate'\n else if (def.window) expressionType = 'window'\n let returnType = def.returns === 'T' ? ('generic' as const) : normalizeReturnType(def.returns)\n\n let argSets: ArgDef[][] = [def.args]\n // If any args are optional (type ends with '?'), expand into multiple overloads\n let optIdx = def.args.findIndex(a => getArgInfo(a).type.endsWith('?'))\n if (optIdx >= 0) {\n argSets = []\n for (let i = optIdx; i <= def.args.length; i++) argSets.push(def.args.slice(0, i))\n }\n\n return argSets.map(args => ({\n params: args.map(a => {\n let {name, type} = getArgInfo(a)\n return {name, allowedTypes: parseArgTypes(a), isVariadic: type.endsWith('...')}\n }),\n returnType: {type: returnType, expressionType},\n fanoutSafe: def.fanoutSafe,\n sqlName: def.sqlName,\n supportsBareInvocation: def.supportsBareInvocation && args.length == 0,\n bareSqlName: def.bareSqlName,\n metadata: def.metadata,\n }))\n}\n\nfunction normalizeReturnType(type: string): FieldType | 'array' {\n if (type == 'array') return 'array'\n if (type == 'bytes') return scalarType('string')\n return scalarType(type as Exclude<TypeKind, 'array'>)\n}\n\n// Build a name -> Overload[] map from a FunctionDef array\nfunction buildMap(defs: FunctionDef[]): Record<string, Overload[]> {\n let map: Record<string, Overload[]> = {}\n for (let def of defs) {\n let overloads = convertDef(def)\n map[def.name] = overloads\n // Register aliases, ensuring they emit the original SQL name\n for (let alias of def.aliases || []) {\n map[alias] = overloads.map(o => ({...o, sqlName: o.sqlName || def.name}))\n }\n }\n return map\n}\n\nlet dialectMaps: Record<string, Record<string, Overload[]>> = {\n bigquery: buildMap(bigQueryFunctions),\n clickhouse: buildMap(clickHouseFunctions),\n duckdb: buildMap(duckDbFunctions),\n snowflake: buildMap(snowflakeFunctions),\n}\n\nfunction findOverloads(name: string, dialect: string): Overload[] {\n let map = dialectMaps[dialect] || dialectMaps['duckdb']\n return map[name.toLowerCase()] || []\n}\n\n// ============================================================================\n// Function Call Analysis\n// ============================================================================\n\nexport function analyzeFunction(analyzer: Analyzer, node: SyntaxNode, scope: Scope, opts: {isWindow?: boolean} = {}): Expr {\n let name = txt(node.getChild('Identifier')).toLowerCase()\n let argNodes = node.getChildren('Expression')\n return analyzeNamedFunction(analyzer, node, name, argNodes, scope, opts)\n}\n\nexport function analyzeBareFunction(analyzer: Analyzer, node: SyntaxNode, name: string, scope: Scope, opts: {isWindow?: boolean} = {}): Expr | undefined {\n let overloads = findOverloads(name, analyzer.config.dialect)\n if (overloads.length == 0) return\n let overload = overloads.find(o => o.supportsBareInvocation && o.params.length == 0)\n if (!overload) return\n return analyzeResolvedFunction(name, overload, [], scope, {...opts, bare: true})\n}\n\nfunction analyzeNamedFunction(analyzer: Analyzer, node: SyntaxNode, name: string, argNodes: SyntaxNode[], scope: Scope, opts: {isWindow?: boolean} = {}): Expr {\n // Check for percentile functions (p50, p90, etc.) before overload lookup\n let percentileMatch = /^p(\\d+)$/.exec(name)\n if (percentileMatch) {\n let args = argNodes.map(n => analyzer.analyzeExpr(n, scope))\n if (args[0]) analyzer.checkTypes(args[0], ['number'], argNodes[0])\n return analyzePercentile(analyzer, node, args, percentileMatch[1], scope, opts)\n }\n\n // Find matching overload\n let overloads = findOverloads(name, analyzer.config.dialect)\n let overload = overloads.find(o => {\n if (o.params.length == argNodes.length) return true\n if (!o.params.some(p => p.isVariadic)) return false\n let requiredCount = o.params.filter(p => !p.isVariadic).length || 1\n return argNodes.length >= requiredCount\n })\n\n // Analyze arguments and check types against overload\n let args = argNodes.map((argNode, idx) => {\n let paramIdx = idx\n if (overload && paramIdx >= overload.params.length) {\n let lastParam = overload.params[overload.params.length - 1]\n if (lastParam?.isVariadic) paramIdx = overload.params.length - 1\n }\n let firstType = overload?.params[paramIdx]?.allowedTypes[0]\n if (firstType?.type == 'sql native' && firstType?.rawType === 'kw') {\n return {sql: txt(argNode), type: scalarType('sql native')}\n }\n let arg = analyzer.analyzeExpr(argNode, scope)\n let allowed = overload?.params[paramIdx]?.allowedTypes.map(t => t.type)\n if (allowed) analyzer.checkTypes(arg, allowed, argNode)\n return arg\n })\n\n if (!overload) {\n if (overloads.length === 0) return analyzer.diag(node, `Unknown function: ${name}`, {sql: 'NULL', type: scalarType('error')})\n let expected = [...new Set(overloads.map(o => o.params.length))].sort().join(' or ')\n return analyzer.diag(node, `Wrong number of arguments for ${name}: expected ${expected}, got ${argNodes.length}`, {sql: 'NULL', type: scalarType('error')})\n }\n\n return analyzeResolvedFunction(name, overload, args, scope, opts)\n}\n\nfunction analyzeResolvedFunction(name: string, overload: Overload, args: Expr[], scope: Scope, opts: {isWindow?: boolean; bare?: boolean} = {}): Expr {\n let returnType: FieldType = overload.returnType.type as FieldType\n if (overload.returnType.type == 'generic') returnType = args[0]?.type || scalarType('string')\n if (overload.returnType.type == 'array') returnType = inferArrayReturnType(args)\n\n let isAgg = overload.returnType.expressionType == 'aggregate' || args.some(a => a.isAgg)\n let canWindow = overload.returnType.expressionType == 'aggregate' || overload.returnType.expressionType == 'window'\n let fanout = mergeFanoutPaths(args.map(a => a.fanout?.path))\n let fanoutConflict = fanout.conflict || args.some(a => a.fanout?.conflict)\n let fanoutSensitivePaths = mergeSensitiveFanouts(...args.map(a => a.fanout?.sensitivePaths))\n let fanoutSafeAgg = overload.returnType.expressionType == 'aggregate' && overload.fanoutSafe\n if (overload.returnType.expressionType == 'aggregate' && !fanoutSafeAgg) {\n fanoutSensitivePaths = mergeSensitiveFanouts(fanoutSensitivePaths, [fanout.path || extendFanoutPath(scope.fanoutPath)])\n }\n let fnName = opts.bare ? overload.bareSqlName || overload.sqlName || name : overload.sqlName || name\n let sql = opts.bare ? fnName : `${fnName}(${args.map(a => a.sql).join(',')})`\n let metadata = inferFunctionFieldMetadata(overload, args)\n return {\n sql,\n type: returnType,\n metadata,\n isAgg,\n canWindow,\n fanout: normalizeExprFanout({path: isAgg ? undefined : fanout.path, sensitivePaths: fanoutSensitivePaths, conflict: fanoutConflict}),\n }\n}\n\nfunction analyzePercentile(analyzer: Analyzer, node: SyntaxNode, args: Expr[], digits: string, scope: Scope, opts: {isWindow?: boolean} = {}): Expr {\n let frac = Number(`0.${digits}`)\n if (Number(digits) == 100) return analyzer.diag(node, 'p100 is not allowed', {sql: 'NULL', type: scalarType('error')})\n if (Number(digits) == 0) return analyzer.diag(node, 'p0 is not allowed', {sql: 'NULL', type: scalarType('error')})\n if (analyzer.config.dialect == 'bigquery' && frac > 0.99) return analyzer.diag(node, 'BigQuery only supports up to p99', {sql: 'NULL', type: scalarType('error')})\n\n let inner = args[0]?.sql || 'NULL'\n let sql: string\n switch (analyzer.config.dialect) {\n case 'duckdb':\n sql = `quantile_cont(${inner}, ${frac})`\n break\n case 'bigquery':\n if (opts.isWindow) {\n sql = `PERCENTILE_CONT(${inner}, ${frac})`\n } else {\n sql = `approx_quantiles(${inner}, 100)[OFFSET(${Math.round(frac * 100)})]`\n }\n break\n case 'clickhouse':\n sql = `quantile(${frac})(${inner})`\n break\n case 'snowflake':\n sql = `PERCENTILE_CONT(${frac}) WITHIN GROUP (ORDER BY ${inner})`\n break\n default:\n return analyzer.diag(node, `Percentile not supported for ${analyzer.config.dialect}`, {sql: 'NULL', type: scalarType('error')})\n }\n return {\n sql,\n type: scalarType('number'),\n isAgg: true,\n canWindow: true,\n fanout: normalizeExprFanout({\n sensitivePaths: [args[0]?.fanout?.path || extendFanoutPath(opts.isWindow ? undefined : scope.fanoutPath)],\n conflict: args.some(a => a.fanout?.conflict),\n }),\n }\n}\n\nfunction inferFunctionFieldMetadata(overload: Overload, args: Expr[]): FieldMeta | undefined {\n if (!overload.metadata) return\n if (typeof overload.metadata == 'function') return overload.metadata(args)\n return overload.metadata\n}\n\nfunction inferArrayReturnType(args: Expr[]): FieldType {\n let arrayArg = args.find(arg => isArrayType(arg.type))\n if (arrayArg && isArrayType(arrayArg.type)) return arrayArg.type\n\n let scalarArg = args.find(arg => !isScalarType(arg.type, 'sql native') && !isScalarType(arg.type, 'error') && !isScalarType(arg.type, 'null'))\n if (scalarArg) return arrayOf(scalarArg.type)\n\n return arrayOf(scalarType('sql native'))\n}\n", "export interface UnsupportedChartProp {\n componentName: string\n prop: string\n message: string\n}\n\nexport const CHART_COMPONENT_PROPS: Record<string, readonly string[]> = {\n BarChart: ['data', 'x', 'y', 'y2', 'splitBy', 'arrange', 'label', 'sort', 'title', 'height', 'width'],\n LineChart: ['data', 'x', 'y', 'y2', 'splitBy', 'sort', 'title', 'height', 'width'],\n AreaChart: ['data', 'x', 'y', 'y2', 'splitBy', 'arrange', 'sort', 'title', 'height', 'width'],\n PieChart: ['data', 'category', 'value', 'title', 'height', 'width'],\n ScatterPlot: ['data', 'x', 'y', 'splitBy', 'title', 'height', 'width'],\n ECharts: ['data', 'config', 'height', 'width', 'renderer'],\n}\n\nconst OBSOLETE_PROP_MESSAGES: Record<string, string> = {\n series: 'Use splitBy instead.',\n chartAreaHeight: 'Use height instead.',\n swapXY: 'Swap the x and y mappings for horizontal bars instead.',\n xFmt: 'Use field metadata or ECharts for custom formatting.',\n yFmt: 'Use field metadata or ECharts for custom formatting.',\n y2Fmt: 'Use field metadata or ECharts for custom formatting.',\n emptySet: 'emptySet is not supported on chart wrappers.',\n emptyMessage: 'emptyMessage is not supported on chart wrappers.',\n}\n\nconst INTERNAL_PROPS = new Set(['children', '$$slots', '$$events', '$$legacy'])\n\nexport function unsupportedChartProps(componentName: string, props: Record<string, unknown>): UnsupportedChartProp[] {\n let allowed = CHART_COMPONENT_PROPS[componentName]\n if (!allowed) return []\n\n let allowedSet = new Set(allowed)\n return Object.keys(props)\n .filter(prop => !INTERNAL_PROPS.has(prop) && !allowedSet.has(prop))\n .map(prop => ({componentName, prop, message: unsupportedChartPropMessage(componentName, prop, props[prop])}))\n}\n\nexport function unsupportedChartPropMessage(componentName: string, prop: string, value?: unknown) {\n return `Unsupported prop \"${prop}\" on ${componentName}. ${unsupportedChartPropHint(prop, value)}`\n}\n\nfunction unsupportedChartPropHint(prop: string, value?: unknown) {\n if (prop == 'type' && value == 'stacked100') return 'Use arrange=\"stack100\" instead.'\n return OBSOLETE_PROP_MESSAGES[prop] || 'Use ECharts for custom chart configuration.'\n}\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from '@lezer/lr'\n\nimport {specializeIdentifier} from './tokens.js'\nconst spec_Identifier = {\n __proto__: null,\n table: 10,\n date: 20,\n timestamp: 24,\n interval: 28,\n array: 40,\n primary_key: 50,\n join: 58,\n one: 62,\n many: 66,\n as: 70,\n on: 76,\n or: 88,\n and: 94,\n not: 124,\n case: 136,\n exists: 156,\n with: 164,\n from: 174,\n inner: 186,\n left: 190,\n right: 194,\n full: 198,\n cross: 202,\n unnest: 208,\n select: 214,\n distinct: 218,\n where: 228,\n group: 234,\n by: 238,\n having: 244,\n union: 250,\n all: 254,\n intersect: 258,\n except: 262,\n order: 270,\n asc: 278,\n desc: 282,\n limit: 288,\n offset: 292,\n true: 300,\n false: 304,\n null: 310,\n count: 320,\n over: 326,\n partition: 334,\n rows: 344,\n range: 348,\n between: 354,\n unbounded: 360,\n preceding: 364,\n following: 368,\n current: 372,\n row: 376,\n extract: 384,\n cast: 392,\n in: 410,\n is: 418,\n like: 434,\n when: 440,\n then: 444,\n else: 450,\n end: 454,\n extend: 472,\n}\nexport const parser = LRParser.deserialize({\n version: 14,\n states:\n \"!0QQYQPOOOOQO'#C_'#C_OOQO'#EP'#EPOtQPO'#EOOOQO'#EU'#EUOyQPO'#ETOOQO'#Ej'#EjO#cQPO'#EiOOQO'#Eq'#EqOOQO'#Et'#EtO#jQPO'#EsOOQO'#Ey'#EyOOQO'#Hh'#HhO$QQPO'#ESO%PQPO'#D}O#oQPO'#D}O%^QPO'#C^OOQO'#Ha'#HaO%^QPO'#H`OOQO'#Hc'#HcO%cQPO'#HdQYQPOOQ&TQPO'#HdO&YQPO'#EpO&YQPO'#ExOOQO'#DQ'#DQO'gQPO'#ERO'lQPO,5:jO*sQPO'#CbO*}QPO'#CbO+SQPO'#EWO,jQPO'#EYO,qQPO'#EXOOQO'#I['#I[O.mQPO,5:oO/jQPO'#CbO1fQPO'#CbOOQO'#Ce'#CeOOQO'#Cg'#CgOOQO'#Ci'#CiOOQO'#Dk'#DkOOQO'#Dj'#DjOOQO'#Dq'#DqO&YQPO'#DxO1nQPO'#IVOOQO'#D{'#D{O6RQPO'#EYOOQO'#El'#ElOOQO'#Eo'#EoOOQO'#En'#EnO6iQPO,5;TO!RQPO,5;TO7gQPO'#DzOOQO'#Fg'#FgOOQO'#Fi'#FiOOQO'#Ff'#FfOOQO'#Fl'#FlOOQO'#Fk'#FkOOQO'#I_'#I_OOQO'#Fq'#FqO7lQPO'#FpO7qQPO'#I^OOQO'#I^'#I^OOQO'#Gc'#GcOOQO'#Gg'#GgO<XQPO'#GiO<dQPO'#GkO<iQPO'#GlOOQO'#IX'#IXOOQO'#Ia'#IaOOQO'#IW'#IWOOQO'#IV'#IVO<nQPO'#ITOOQO'#IU'#IUOBPQPO'#ISOOQO'#IT'#ITOOQO'#IS'#ISOEZQPO'#IQOOQO'#IR'#IROHlQPO'#EnOOQO'#IQ'#IQOIsQPO'#DpOIzQPO'#GbOJPQPO'#GfOOQO'#Ev'#EvO!RQPO,5;_OOQO-E;f-E;fOOQO'#E|'#E|OOQO'#FQ'#FQOOQO'#FS'#FSOJUQPO'#E{OOQO'#E{'#E{OJmQPO'#HkOJtQPO,5:iOOQO'#FW'#FWO#jQPO'#FVOOQO'#Fa'#FaOKRQPO'#F`OOQO,5:i,5:iOKWQPO,5:iOJtQPO,5:iOKfQPO,58xOKnQPO,5=zOOQO,5>O,5>OOOQO-E;b-E;bOKsQPO,5;[OLqQPO,5;dOOQO'#DO'#DOOMoQPO,5:mOtQPO'#HgOMtQPO1G0UOOQO,5>P,5>PONYQPO,58|OOQO-E;c-E;cOOQO,5:r,5:rOtQPO,5:rO!$vQPO,5:tOOQO,5:s,5:sOtQPO,5:sOOQO'#Cx'#CxOOQO'#E['#E[OOQO'#E^'#E^OOQO'#E`'#E`OOQO'#Eb'#EbOOQO'#Ed'#EdO!${QPO'#EZO!%WQPO'#EZOOQO'#Hi'#HiO!%]QPO1G0ZO!&YQPO,5<ZOOQO,5;Z,5;ZOOQO,5:d,5:dO!&aQPO,5:eO!&rQPO,5=YO!&zQPO1G0oO!'wQPO1G0oO!'wQPO1G0oO,jQPO,5:fO!(uQPO,5<[OOQO'#Ft'#FtO!)SQPO'#FsOOQO,5<Y,5<YOOQO'#I`'#I`OOQO,5=T,5=TO!)XQPO,5=TOOQO,5=V,5=VOOQO,5=W,5=WOOQO'#De'#DeO&YQPO,5:cOOQO'#D`'#D`OOQO'#GS'#GSO&YQPO,5:bO&YQPO,5:aO!)^QPO,5:aOOQO'#Gp'#GpO!)iQPO,5=ZOOQO'#Gt'#GtO!)nQPO,5=_OOQO'#G|'#G|OOQO'#Gw'#GwO&YQPO,5=bOOQO'#D['#D[O&YQPO,5:`OOQO'#DX'#DXO&YQPO,5:_OOQO,5;Y,5;YOtQPO,5;YO!)vQPO,5:[OOQO'#HP'#HPOOQO'#Ho'#HoO!*OQPO,5:[O&YQPO'#HOO!*ZQPO,5<|O&YQPO,5=QO!*cQPO1G0yOOQO'#FO'#FOOOQO,5;g,5;gOOQO'#FU'#FUOOQO,5>V,5>VOOQO-E;i-E;iOOQO1G0T1G0TO!+aQPO1G0TO!+oQPO,5;qO!+wQPO,5;zO!,VQPO1G0TO!,dQPO1G.dO!-qQPO1G3eO!-vQPO1G3fO,jQPO1G0XOOQO,5>R,5>ROOQO-E;e-E;eP!/TQPO'#HeOOQO1G0^1G0^OOQO1G0`1G0`OOQO1G0_1G0_OOQO'#Eg'#EgOOQO'#I]'#I]O!/YQPO,5:uO!0jQPO'#EfO!${QPO,5:uOOQO-E;g-E;gOOQO1G1u1G1uO!0oQPO1G1uOOQO'#Cm'#CmOOQO'#Co'#CoO!0zQPO'#CnOOQO'#Cl'#ClOOQO'#Do'#DoOOQO1G0P1G0POOQO1G2t1G2tOOQO,5>U,5>UO!1PQPO7+&ZOOQO-E;h-E;hO!1|QPO7+&ZO!2zQPO1G0QOOQO1G1v1G1vO!3PQPO1G1vO!3UQPO1G1vO&YQPO1G1vO!3^QPO,5<_OOQO'#Gj'#GjOOQO1G2o1G2oOOQO1G/}1G/}O!3oQPO1G/|O!8PQPO1G/{O&YQPO1G/{O!8_QPO1G2uOOQO,5=c,5=cO6RQPO1G2uOOQO1G2y1G2yO!)qQPO1G2yO!8dQPO1G2|OOQO1G/z1G/zO!;xQPO1G/yOOQO1G0t1G0tO!*OQPO1G/vOOQO-E;m-E;mOOQO'#HU'#HUOOQO'#HW'#HWOOQO1G/v1G/vO!*UQPO1G/vO&YQPO'#HTO!?ZQPO,5=jOOQO'#Ge'#GeO!?cQPO1G2hO!?hQPO1G2lO!?pQPO7+&eO!@mQPO7+&eOOQO7+%o7+%oO!AkQPO'#FYO!BSQPO1G1]OOQO'#Fc'#FcO!BeQPO1G1fO!BjQPO7+%oO!DiQPO'#CbO!E_QPO'#CdO!EfQPO'#CdO!EmQPO'#CdO!&aQPO'#CcO!EwQPO'#CwO%^QPO'#CvO!FPQPO'#DiO!GZQPO'#H}OOQO'#IP'#IPOOQO'#IO'#IOOOQO'#H}'#H}O!HqQPO'#H{OOQO'#H|'#H|O!JUQPO'#HzOOQO'#H{'#H{OOQO'#Hz'#HzO!JcQPO'#HxOOQO'#Hy'#HyO!?hQPO'#DVOOQO'#Hx'#HxOOQO'#Hw'#HwO!JnQPO'#HfO!LRQPO7+$OO!LYQPO'#DVO,jQPO7+)PO!BxQPO'#CbO!L_QPO'#HYOOQO'#Ic'#IcO!LgQPO'#HpO!MzQPO7+)QO!NRQPO7+%sOOQO'#DR'#DRO&YQPO1G0aO&YQPO,5;QO!NWQPO1G0aO# hQPO7+'aO# pQPO7+'aOOQO7+'a7+'aO!&aQPO,59YP!RQPO'#HjO# wQPO<<IuOOQO7+%l7+%lOOQO7+'b7+'bO#!tQPO7+'bOOQO'#Fx'#FxO#jQPO'#FzOOQO'#F}'#F}OOQO'#GP'#GPO#!|QPO'#F|O##ZQPO'#FvO##^QPO'#FvOOQO'#Fv'#FvOOQO1G1y1G1yO##iQPO1G1yO#jQPO'#FwO&YQPO7+%gO!8PQPO7+%gO6RQPO7+(aO##nQPO7+(aO##sQPO'#GrOOQO7+(e7+(eOOQO7+%b7+%bO!*UQPO7+%bO#$OQPO,5=oOOQO'#HR'#HRO&YQPO1G3UO&YQPO7+(SO!&aQPO7+(WO#$WQPO<<JPOOQO'#F['#F[OOQO'#F^'#F^OOQO,5;t,5;tO#%TQPO7+&wO#%iQPO7+&wOOQO7+'Q7+'QOOQO<<IZ<<IZOOQO,5=t,5=tO!)XQPO,5=tOOQO'#Ck'#CkO#%zQPO,58}OOQO'#Cz'#CzOOQO'#C|'#C|OOQO,59c,59cO#'bQPO,59bOOQO,5:T,5:TO!&aQPO,5:XO!FPQPO,5:OO!)^QPO,59xO!FPQPO,59yO!FPQPO,59xO#'jQPO,5=uO!)nQPO,5=vO!FPQPO,5=wO!FPQPO,59uO!FPQPO,59rOtQPO,59qOOQO,5>Q,5>QOOQO-E;d-E;dOOQO<<Gj<<GjO&YQPO,59qO#'oQPO<<LkOOQO,5>[,5>[OOQO-E;n-E;nOOQO<<Ll<<LlOOQO<<I_<<I_O#'tQPO7+%{O#)UQPO1G0lO&YQPO7+%{OOQO-E;k-E;kO#)^QPO<<J{OOQO<<J{<<J{O#)eQPO,5>XO#)yQPO1G.tOOQO<<J|<<J|O&YQPO,5<fOOQO'#GV'#GVOOQO'#G]'#G]O#*OQPO'#GUO#*WQPO'#GUO##PQPO'#GROOQO'#Ga'#GaOOQO,5<h,5<hO#*]QPO'#GUOOQO,5<b,5<bO#*hQPO,5<bOOQO7+'e7+'eO&YQPO,5<cO#*sQPO<<IRO&YQPO<<IRO#.XQPO<<K{OOQO<<K{<<K{O#.^QPO,5=^O#.fQPO,5=^OOQO<<H|<<H|O#.mQPO7+(pO#.{QPO<<KnO#/TQPO<<KrOOQO,5>W,5>WO#/YQPO<<JcOOQO-E;j-E;jOOQO1G3`1G3`OOQO'#Ct'#CtOOQO'#Cs'#CsOOQO1G.i1G.iO%^QPO1G.|OtQPO1G.|OOQO1G/s1G/sOOQO1G/j1G/jO!FPQPO1G/dO#/nQPO1G3aO#/sQPO1G/eO!8PQPO1G/dO6RQPO1G3aOOQO1G3b1G3bO!)qQPO1G3bO#1WQPO1G3cOOQO1G/a1G/aO#1lQPO1G/^OOQO1G/]1G/]O#1wQPO1G/]OOQOANBVANBVO'gQPO7+&WO#3_QPO<<IgP&YQPO'#HmOOQOAN@gAN@gOOQO7+$`7+$`O#4oQPO1G2QO#4}QPO'#F{OOQO'#GX'#GXOOQO'#GZ'#GZOOQO,5<p,5<pOOQO'#G_'#G_O#5fQPO,5<mOOQO1G1|1G1|O#5kQPO1G1}O#6PQPOAN>mOOQOANAgANAgO#9eQPO1G2xOOQOANAYANAYOOQOANA^ANA^P!+oQPO'#HlO#9lQPO'#DTOOQO7+$h7+$hO#'eQPO7+$hO!8PQPO7+%OO6RQPO7+({O!FPQPO7+%OO#9qQPO7+({OOQO7+(|7+(|OtQPO<<IrO#9vQPO7+'lO#:TQPO7+'lOOQO,5<g,5<gO##PQPO1G2XO#:cQPO7+'iO#:tQPO7+'iO%^QPO,59oO%^QPO<<HSO!FPQPO<<HjO#;UQPO<<LgO#;ZQPO<<HjOOQO<<Lg<<LgOOQOAN?^AN?^OOQO,5>Y,5>YO#;oQPO<<KWOOQO-E;l-E;lOOQO7+'s7+'sO#;|QPO<<KTOOQO1G/Z1G/ZOOQOAN=nAN=nO#<^QPOAN>UOOQOANBRANBRP&YQPO'#Hn\",\n stateData:\n \"#<y~O&gOS&hOS~OTPO!tQO!ySO#_UO#fWO#iXO#nZO&UaO~OSiO~OSlO&joO~OSsOYuO[vO^wO!TyO!UyO!Y!QO!`xO!fzO!p}O#}![O$X![O$[!VO$^!WO$a!YO$f!]O%W!aO%[!bO%a!fO&j!OO~O#a!PO~P!RO#k!vO~O!ySO#_UO#fWO#iXO#nZO~O#q!vX#u!vX#w!vX#{!vX$U!vX&e!vX'U!vX&|!vX~P#oO#q!yO#u!zO#w!{O#{#QO$U#SO~O&e!qX'U!qX&|!qX~P$nOSlO~O'U#ZOT&WX!t&WX!y&WX#_&WX#f&WX#i&WX#n&WX&U&WX&e&WX~O'U#ZO~OSsOYuO[vO^wO!TyO!UyO!`xO!fzO!p}O#}![O$X![O$[!VO$^!WO$a!YO$f!]O%W!aO%[!bO%a!fO&j!OO~Os#_O~O&}#aO!y!ra#_!ra#f!ra#i!ra#n!ra~O&i#cOSUXmUXsUX!yUX#PUX#RUX#TUX#VUX#XUX#_UX#fUX#iUX#nUX#qUX#uUX#wUX#{UX$UUX&eUX'UUX&|UXxUXYUX[UX^UX!TUX!UUX!`UX!fUX!pUX#}UX$XUX$[UX$^UX$aUX$fUX%WUX%[UX%aUX&}UX~O&jUXvUX~P(QOS#dO~OSiOs#_Om!zX!y!zX#P!zX#R!zX#T!zX#V!zX#X!zX#_!zX#f!zX#i!zX#n!zX#q!zX#u!zX#w!zX#{!zX$U!zX&e!zX'U!zX&|!zXv!zX~O!tQO~P#oOSiOs#_Om!{X!y!{X#P!{X#R!{X#T!{X#V!{X#X!{X#_!{X#f!{X#i!{X#n!{X#q!{X#u!{X#w!{X#{!{X$U!{X&e!{X'U!{X&|!{Xv!{X~Om#kO#P#lO#R#mO#T#nO#V#oO#X#pO~O!y!wa#_!wa#f!wa#i!wa#n!wa#q!wa#u!wa#w!wa#{!wa$U!wa&e!wa'U!wa&|!wa~P.XO&j#uOeUXfUX|UX!PUX!VUX!YUX!ZUX![UX!bUX$wUX%eUX%iUX%lUX%mUX%nUX%oUX%qUX%tUX%vUX%{UX$|UX%OUX%yUX$PUX$RUX$rUX$tUX~P(QOS#dO!Y#vO~O!b#xOS&yXe&yXf&yXs&yXx&yX|&yX!P&yX!T&yX!U&yX!V&yX!Y&yX!Z&yX![&yX!`&yX!y&yX#_&yX#f&yX#i&yX#n&yX#q&yX#u&yX#w&yX#{&yX$U&yX$w&yX%e&yX%i&yX%l&yX%m&yX%n&yX%o&yX%q&yX&e&yX&}&yX'U&yX&|&yX%t&yX%v&yX%{&yXm&yX#P&yX#R&yX#T&yX#V&yX#X&yX$|&yX%O&yX%y&yXY&yX[&yX^&yX!f&yX!p&yX#}&yX$X&yX$[&yX$^&yX$a&yX$f&yX%W&yX%[&yX%a&yX$P&yX$R&yX$r&yX$t&yX~O!tQO!ySO#_UO#fWO#iXO#nZO~P&YO&}#zO!y#]a#_#]a#f#]a#i#]a#n#]a#q#]a#u#]a#w#]a#{#]a$U#]a&e#]a'U#]a&|#]a~O&j#}O~O&j$OO~O$i$POS'QXe'QXf'QXs'QXx'QX|'QX!P'QX!T'QX!U'QX!V'QX!Y'QX!Z'QX!['QX!`'QX!b'QX!y'QX#_'QX#f'QX#i'QX#n'QX#q'QX#u'QX#w'QX#{'QX$U'QX$w'QX%e'QX%i'QX%l'QX%m'QX%n'QX%o'QX%q'QX&e'QX&}'QX'U'QX&|'QX%t'QX%v'QX%{'QXm'QX#P'QX#R'QX#T'QX#V'QX#X'QX$|'QX%O'QX%y'QXY'QX['QX^'QX!f'QX!p'QX#}'QX$X'QX$['QX$^'QX$a'QX$f'QX%W'QX%['QX%a'QX$P'QX$R'QX$r'QX$t'QX~OSlO#}$SO$X$TO~O$X$VO~O$X$WO~O!Y$XO!Z$XO![$XOS&wXe&wXf&wXs&wXx&wX|&wX!P&wX!T&wX!U&wX!V&wX!`&wX!y&wX#_&wX#f&wX#i&wX#n&wX#q&wX#u&wX#w&wX#{&wX$U&wX$w&wX%e&wX%i&wX%l&wX%m&wX%n&wX%o&wX%q&wX&e&wX&}&wX'U&wX&|&wX%t&wX%v&wX%{&wXm&wX#P&wX#R&wX#T&wX#V&wX#X&wX$|&wX%O&wX%y&wXY&wX[&wX^&wX!f&wX!p&wX#}&wX$X&wX$[&wX$^&wX$a&wX$f&wX%W&wX%[&wX%a&wX$P&wX$R&wX$r&wX$t&wX~Oe$eOf$eOx$eO!T$ZO!U$ZO!V$ZO!`xO$w$[O%e$`O%i$bO%l$eO%m$eO%n$eO%o$eO%q$dO~OS&vXs&vX|&vX!P&vX!y&vX#_&vX#f&vX#i&vX#n&vX#q&vX#u&vX#w&vX#{&vX$U&vX&e&vX&}&vX'U&vX&|&vX%t&vX%v&vX%{&vXm&vX#P&vX#R&vX#T&vX#V&vX#X&vX$|&vX%O&vX%y&vXY&vX[&vX^&vX!f&vX!p&vX#}&vX$X&vX$[&vX$^&vX$a&vX$f&vX%W&vX%[&vX%a&vX$P&vX$R&vX$r&vX$t&vX~PAOO!P$gOS&tXs&tX|&tX!y&tX#_&tX#f&tX#i&tX#n&tX#q&tX#u&tX#w&tX#{&tX$U&tX&e&tX&}&tX'U&tX&|&tX%t&tX%v&tX%{&tXm&tX#P&tX#R&tX#T&tX#V&tX#X&tX$|&tX%O&tX%y&tXY&tX[&tX^&tX!T&tX!U&tX!`&tX!f&tX!p&tX#}&tX$X&tX$[&tX$^&tX$a&tX$f&tX%W&tX%[&tX%a&tX$P&tX$R&tX$r&tX$t&tX~OSiOs#_O|$iO!y#bX#_#bX#f#bX#i#bX#n#bX#q#bX#u#bX#w#bX#{#bX$U#bX&e#bX&}#bX'U#bX&|#bX~O%t$nO~P&YO&j$rO~O&j$sO~O#s$uO!y#oX#_#oX#f#oX#i#oX#n#oX&j#oX~O&joO~P#oO&e!qa'U!qa&|!qa~P$nO#}$}O~O$U#SO&e!qa'U!qa&|!qa~Os#_O&j%PO~O&j%RO~O|$iO!y#da#_#da#f#da#i#da#n#da#q#da#u#da#w#da#{#da$U#da&e#da'U#da&|#da~O|$iO!y#la#_#la#f#la#i#la#n#la#q#la#u#la#w#la#{#la$U#la&e#la'U#la&|#la~O&j%SO~O&}#aO!y!ri#_!ri#f!ri#i!ri#n!ri~O&i#cOSUamUasUa!yUa#PUa#RUa#TUa#VUa#XUa#_Ua#fUa#iUa#nUa#qUa#uUa#wUa#{Ua$UUa&eUa'UUaeUafUaxUa|Ua!PUa!TUa!UUa!VUa!YUa!ZUa![Ua!`Ua!bUa$wUa%eUa%iUa%lUa%mUa%nUa%oUa%qUa&}Ua&jUa&|Ua%tUavUa%vUa%{Ua$|Ua%OUa%yUaYUa[Ua^Ua!fUa!pUa#}Ua$XUa$[Ua$^Ua$aUa$fUa%WUa%[Ua%aUa$PUa$RUa$rUa$tUa~O&|%XO~OSlO#[%ZO&joO~Om#kO~O!y!wi#_!wi#f!wi#i!wi#n!wi#q!wi#u!wi#w!wi#{!wi$U!wi&e!wi'U!wi&|!wi~P.XO&|%aO~P&YOS%cOYuO[vO^wOd%dO~O|$iO&|%iO~O!y#]i#_#]i#f#]i#i#]i#n#]i#q#]i#u#]i#w#]i#{#]i$U#]i&e#]i'U#]i&|#]i~P!RO&}%kO!y#]i#_#]i#f#]i#i#]i#n#]i#q#]i#u#]i#w#]i#{#]i$U#]i&e#]i'U#]i&|#]i~O!Y%pO#a!PO&|%oO~P&YO&j%sO~OS%tO~O$w$[O%e$`O%q$dO~O&j%|O~O!`xO$a!YO~O|$iO%t$nO~O%t$nO%y&VO%{&WO~OS&]O$X&]O~O&}&`O!y#gi#_#gi#f#gi#i#gi#n#gi#q#gi#u#gi#w#gi#{#gi$U#gi&e#gi'U#gi&|#gi~O$U#SO&e!qi'U!qi&|!qi~OS&cO#}&cO~O$W&eO&e$Sa'U$Sa&|$Sa~O&e!qi'U!qi&|!qi~P$nOS&hOYuO[vO^wOm#kO!TyO!UyO!`xO!fzO!p}O#}![O$X![O$[!VO$^!WO$a!YO$f!]O%W!aO%[!bO%a&qO~O&j'RO~OS'SOYuO[vO^wOm#kO!TyO!UyO!`xO!fzO!p}O#}![O$X![O$[!VO$^!WO$a!YO$f!]O%W!aO%[!bO%a&qO~O&i#cO~Ov'YOm!}a!y!}a#P!}a#R!}a#T!}a#V!}a#X!}a#_!}a#f!}a#i!}a#n!}a#q!}a#u!}a#w!}a#{!}a$U!}a&e!}a'U!}a&|!}a~O&j'[O~O|$iO&|'`O&}'_O~Oe'aO~O!y#]q#_#]q#f#]q#i#]q#n#]q#q#]q#u#]q#w#]q#{#]q$U#]q&e#]q'U#]q&|#]q~P!RO&}'cO!y#]q#_#]q#f#]q#i#]q#n#]q#q#]q#u#]q#w#]q#{#]q$U#]q&e#]q'U#]q&|#]q~O&|'dO~O&|'eO~O|$iO&|'eO~O#{#QO$m'gO$r'iO$t'jO&|'oO~O!Y$XO!Z$XO![$XOS!jie!jif!jis!jix!ji|!ji!P!ji!T!ji!U!ji!V!ji!`!ji!y!ji#_!ji#f!ji#i!ji#n!ji#q!ji#u!ji#w!ji#{!ji$U!ji$w!ji%e!ji%i!ji%l!ji%m!ji%n!ji%o!ji%q!ji&e!ji&}!ji'U!ji&|!ji%t!ji%v!ji%{!jim!ji#P!ji#R!ji#T!ji#V!ji#X!ji$|!ji%O!ji%y!jiY!ji[!ji^!ji!f!ji!p!ji#}!ji$X!ji$[!ji$^!ji$a!ji$f!ji%W!ji%[!ji%a!ji$P!ji$R!ji$r!ji$t!ji~O!P$gO!T$ZO!U$ZO!V$ZO~O&j'tO~O!T$ZO!U$ZO!V$ZOS%jis%ji|%ji!P%ji!y%ji#_%ji#f%ji#i%ji#n%ji#q%ji#u%ji#w%ji#{%ji$U%ji&e%ji&}%ji'U%ji&|%ji%t%ji%v%ji%{%jim%ji#P%ji#R%ji#T%ji#V%ji#X%ji$|%ji%O%ji%y%jiY%ji[%ji^%ji!`%ji!f%ji!p%ji#}%ji$X%ji$[%ji$^%ji$a%ji$f%ji%W%ji%[%ji%a%ji$P%ji$R%ji$r%ji$t%ji~O!P$gOS!gis!gi|!gi!y!gi#_!gi#f!gi#i!gi#n!gi#q!gi#u!gi#w!gi#{!gi$U!gi&e!gi&}!gi'U!gi&|!gi%t!gi%v!gi%{!gim!gi#P!gi#R!gi#T!gi#V!gi#X!gi$|!gi%O!gi%y!giY!gi[!gi^!gi!T!gi!U!gi!`!gi!f!gi!p!gi#}!gi$X!gi$[!gi$^!gi$a!gi$f!gi%W!gi%[!gi%a!gi$P!gi$R!gi$r!gi$t!gi~O|$iO%v'{O~O!ySO~Os#_O|$iO~O!y#gq#_#gq#f#gq#i#gq#n#gq#q#gq#u#gq#w#gq#{#gq$U#gq&e#gq'U#gq&|#gq~P!RO&}(PO!y#gq#_#gq#f#gq#i#gq#n#gq#q#gq#u#gq#w#gq#{#gq$U#gq&e#gq'U#gq&|#gq~O$P(QO$R(RO$U#|X&e#|X&}#|X'U#|X&|#|X~O&}(TO$U#yi&e#yi'U#yi&|#yi~O#}(VO~O$U#SO&e!qq'U!qq&|!qq~O&i#cO&j#uOeUXfUXsUXxUX|UX!PUX!TUX!UUX!VUX!YUX!ZUX![UX!`UX!bUX$wUX%eUX%iUX%lUX%mUX%nUX%oUX%qUX&QtX~OSWXYWX[WX^WXdWX~P!BxOSWXYWX[WX^WXdWX~O$X$VO~P!D|O$X$WO~P!D|O#}(YO$X(XO~P!D|Oo(]Oq(^O~OSsOYuO[vO^wO!TyO!UyO!`xO!fzO!p}O#}![O$X![O$[!VO$^!WO$a!YO$f!]O%W!aO%[!bO%a&qO~O!b(bOe&qXf&qXs&qXx&qX|&qX!P&qX!T&qX!U&qX!V&qX!Y&qX!Z&qX![&qX!`&qX$w&qX%e&qX%i&qX%l&qX%m&qX%n&qX%o&qX%q&qX~O!Y$XO!Z$XO![$XOe&oXf&oXs&oXx&oX|&oX!P&oX!T&oX!U&oX!V&oX!`&oX$w&oX%e&oX%i&oX%l&oX%m&oX%n&oX%o&oX%q&oX~Os&nX|&nX!P&nX~PAOO!P$gOs&lX|&lX~O&}(mOS&YXY&YX[&YX^&YXm&YX!T&YX!U&YX!`&YX!f&YX!p&YX#}&YX$X&YX$[&YX$^&YX$a&YX$f&YX%W&YX%[&YX%a&YX&|&YX~O&|(oO~P!,dO&Q(pO~O#}(YO$X(XO~O&}(rOS&dXY&dX[&dX^&dXm&dX!T&dX!U&dX!`&dX!f&dX!p&dX#}&dX$X&dX$[&dX$^&dX$a&dX$f&dX%W&dX%[&dX%a&dX&|&dX~O&|(tO~P!-vO&|(uO~Ov'YOm!}i!y!}i#P!}i#R!}i#T!}i#V!}i#X!}i#_!}i#f!}i#i!}i#n!}i#q!}i#u!}i#w!}i#{!}i$U!}i&e!}i'U!}i&|!}i~O&|({O&}(zO~O&|({O~P&YO!y#]y#_#]y#f#]y#i#]y#n#]y#q#]y#u#]y#w#]y#{#]y$U#]y&e#]y'U#]y&|#]y~P!RO|$iO&|)OO~O$w$[O$z)QO%Q)RO~P&YO#{#QO$r'iO$t'jO&|$jX~O&|)[O~O&|)aO~O|$iO&})cO&|%fX~O|$iO%{%wa~O!y#gy#_#gy#f#gy#i#gy#n#gy#q#gy#u#gy#w#gy#{#gy$U#gy&e#gy'U#gy&|#gy~P!ROS&cO#}&cO$U#yq&e#yq'U#yq&|#yq~O&})iO$U#yq&e#yq'U#yq&|#yq~Oi)lOSVaYVa[Va^VamVa!TVa!UVa!`Va!fVa!pVa#}Va$XVa$[Va$^Va$aVa$fVa%WVa%[Va%aVa&|Va&}Va~Os#_Ov'YO~O&j)wO~O&|*PO~O|$iOm!}q!y!}q#P!}q#R!}q#T!}q#V!}q#X!}q#_!}q#f!}q#i!}q#n!}q#q!}q#u!}q#w!}q#{!}q$U!}q&e!}q'U!}q&|!}q~O|$iO&|*QO~O&|*TO~P&YO|$iO&|&aa&}&aa#{&aa$r&aa$t&aa~Of*UO~O$|*XO%O*YO~O%S*[O~O|$iO$|*XO%O*YO~O$r'iO$t'jO&|$ja~O!T$ZO!U$ZO!V$ZOS!iys!iy|!iy!P!iy!y!iy#_!iy#f!iy#i!iy#n!iy#q!iy#u!iy#w!iy#{!iy$U!iy&e!iy&}!iy'U!iy&|!iy%t!iy%v!iy%{!iym!iy#P!iy#R!iy#T!iy#V!iy#X!iy$|!iy%O!iy%y!iyY!iy[!iy^!iy!`!iy!f!iy!p!iy#}!iy$X!iy$[!iy$^!iy$a!iy$f!iy%W!iy%[!iy%a!iy$P!iy$R!iy$r!iy$t!iy~O&|*aO~O&}*bO&|%fa~O&|%fa~P&YO|$iO%t%rq%y%rq%{%rq~O|$iO&|*cO~O&|*dO~OS&cO#}&cO$U#yy&e#yy'U#yy&|#yy~O&j*jO~O!Y$XO!Z$XO![$XOe!Rif!Ris!Rix!Ri|!Ri!P!Ri!T!Ri!U!Ri!V!Ri!`!Ri$w!Ri%e!Ri%i!Ri%l!Ri%m!Ri%n!Ri%o!Ri%q!Ri~O!T$ZO!U$ZO!V$ZOs&Pi|&Pi!P&Pi~O!P$gOszi|zi~O|$iOSyiYyi[yi^yimyi!Tyi!Uyi!`yi!fyi!pyi#}yi$Xyi$[yi$^yi$ayi$fyi%Wyi%[yi%ayi&|yi&}yi~O|$iOm!}y!y!}y#P!}y#R!}y#T!}y#V!}y#X!}y#_!}y#f!}y#i!}y#n!}y#q!}y#u!}y#w!}y#{!}y$U!}y&e!}y'U!}y&|!}y~O&}*oO$r$ni$t$ni&|$ni~O|$iO$P(QO$R(RO$r$oX$t$oX&|$oX&}$oX~O!P$gO~O|$iO&}*tO#{$ki$r$ki$t$ki&|$ki~O!T$ZO!U$ZO!V$ZOS!i!Rs!i!R|!i!R!P!i!R!y!i!R#_!i!R#f!i!R#i!i!R#n!i!R#q!i!R#u!i!R#w!i!R#{!i!R$U!i!R&e!i!R&}!i!R'U!i!R&|!i!R%t!i!R%v!i!R%{!i!Rm!i!R#P!i!R#R!i!R#T!i!R#V!i!R#X!i!R$|!i!R%O!i!R%y!i!RY!i!R[!i!R^!i!R!`!i!R!f!i!R!p!i!R#}!i!R$X!i!R$[!i!R$^!i!R$a!i!R$f!i!R%W!i!R%[!i!R%a!i!R$P!i!R$R!i!R$r!i!R$t!i!R~O&|%fi~P&YOx*uO~O&|*zO~O$r$nq$t$nq&|$nq~P&YO&}*}O$r$nq$t$nq&|$nq~O&}+QO#{$kq$r$kq$t$kq&|$kq~O#{$kq$r$kq$t$kq&|$kq~P&YO&|+UO~O!T$ZO!U$ZO!V$ZOs!Qy|!Qy!P!Qy~O$r$ny$t$ny&|$ny~P&YO#{$ky$r$ky$t$ky&|$ky~P&YO!T$ZO!U$ZO!V$ZOs!Q!R|!Q!R!P!Q!R~O&h!U!b&Q!Y!Z~\",\n goto: \"!Bq'WPP'X']PP'a)c)g)kP+^P-PP.t.w/S/S/ZPPP/b/eP/h/p/vP0TP0TP0WP0s1jP1vP/h1|2SP2o2vP3_3g3tPPP4U4dPPP4l4|6hP8^P8n8w:cP;{<{=|?O@VA_Bi8wCsPE]EzFXPFfFlGPGaPGtGtG{I_IcPIcPIcPIcPIcPGwIgPGPIkPI{PJRJdGPJoPGPKPPKaPGPKmPK}LTPLZPL^PL^PLdLgLqPL{PMTPMTPMZMjPMsPPMv! `P! `PMv!!xP!$n!&W!&W!'pP!)Y!)]P!)`!)c!)fP!)i!)o!)w!*RP!*RP!*X!*[P!*k!*tP!*yP!*yP!*}P!+SP!*X8w!+VP!,o8w!,rP!.[!/f8w8wP!/l=|!0vP!1S=|!1`P=|!1fPPPP!1lP!1t!1zP!2QP!2T!2ZP!2_P:R3_3_3_P'X'X!2iP!2m!2q!2w!4q!4w!4}!5a!5g!5u!6P!6V!6e!6k!6uPPPPPP!6{!7P!7V!7`!7j!8R!8c!8w8^!9X!;T!<W!=[!>m!?w!AVBiPP!Ba!Bd8w!$n!BjBiP!BmTdOeT`OeUnT#q%_#|!`Vgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VQ#X`Q#YbQ$S!cQ(`&nS*f)o*vR+R*uT&}%P'PT&l%P'P#x!dVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%R%k%r%y%|&Z&`&o'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VY%c#x&l'a(O(bT&i%P'P#x!eVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%R%k%r%y%|&Z&`&o'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VY%c#x&l'a(O(bT&j%P'P#`!cVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+VY%c#x&l'a(O(bS&k%P'Pi'T%R&o'W(c(e(f(i(j(k)s*k*wR([&lU%g#x(O(bQ(Z&lR(}'aZ%f#x&l'a(O(bZ%e#x&l'a(O(bR)n([R)m([S&}%P'PT'U%R'WX&n%P%R'P'WS#qr#tQ%_#rX&m%P%R'P'WR(_&mQ#`jQ#gnQ#jpQ$l!qQ%Q#XQ(O&_Q(l&{Q)p(`R*n*QSjR#aQ#fnQ#ipQ$k!qQ%W#gQ%Y#jQ&S$lW'Q%P%R'P'WQ)}(lQ*h)pR*{*nQ'Z%]Q(x']Q)o(`R*v*hQ*g)oR+S*vX&|%P%R'P'W|$j!q#]#^#y$m%b%q&[&_'f'v'z(v(w(|)X)e)f*O*R*W*_R(k&{Z&z%P%R'P'W(kS$h!o&RQ'r%xS(j&y)|Q)_'sQ*k)vQ*r*]R*w*i]&x%P%R'P'W(j(kg&w%P%R'P'W(f(i(j(k)s*k*w[$]!l%x&P's)^*`](e&v)v)z*i*y+Ti&u%P%R'P'W(e(f(i(j(k)s*k*wS$Y!j%wT(c&t)um&s%P%R&o'P'W(c(e(f(i(j(k)s*k*w#`{Vgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+Vm&o%P%R&o'P'W(c(e(f(i(j(k)s*k*w#|yVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VQ$_!lQ&O$cQ(d&vR)y(hm&r%P%R&o'P'W(c(e(f(i(j(k)s*k*wQ%h#xQ)g(OR)q(b#`!fVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+Vm&q%P%R&o'P'W(c(e(f(i(j(k)s*k*w#}!sVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+V!{!rVgh!O!T!s!w#u#z$O$q$s%k%r%|&Z&`'Z'['_'b'c'k't'|'}(P(p(x(z)P)U)])c)w*S*b*j*o*r*t*}+Q+V!}!pVgh!O!T!s!w#u#z$O$j$q$s%k%r%|&Z&`'Z'['_'b'c'k't'|'}(P(p(x(z)P)U)])c)w*S*b*j*o*r*t*}+Q+V#P!nVgh!O!T!s!w#u#z$O$h$j$q$s%k%r%|&Z&`'Z'['_'b'c'k't'|'}(P(p(x(z)P)U)])c)w*S*b*j*o*r*t*}+Q+V#Z!mVgh!O!T!s!w#u#z$O$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+V#]!kVgh!O!T!s!w#u#z$O$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+V#a!iVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+V#a!hVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+V#}!UVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VScOeS#ho!OQ%n#}Q'X%SQ'u%|Q(q'RQ)`'tQ*l)wR*x*jg_Oeo!O#}%S%|'R't)w*jgROeo!O#}%S%|'R't)w*jQkRR%T#af^Oeo!O#}%S%|'R't)w*jQ#W_R$w#Om[O]_eo!O#O#}%S%|'R't)w*jlTO]_eo!O#O#}%S%|'R't)w*jR'}&^QqTT%[#q%_UpT#q%_#`!gVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+VR$w#OT#sr#tT#rr#tT%^#q%_mVO]_eo!O#O#}%S%|'R't)w*jQ!TVR%r$OQ!SVQ#|!TQ$t!w]%j#z%k&`'b'c(Pc!RV!T!w#z%k&`'b'c(PmgO]_eo!O#O#}%S%|'R't)w*jmYO]_eo!O#O#}%S%|'R't)w*jQ!wYQ$|#RQ)P'hR)]'qmhO]_eo!O#O#}%S%|'R't)w*jX#O^#P#W%OX!|^#P#W%OR$v!|X!}^#P#W%OR$x#OQ#V^S${#P#WR&g%OW#R^#P#W%OT'h%s'lQ&d$|V)h(T)i*eQ(S&cR*q*WQ#U^U$z#P#V#WS&b${%OR(W&g_#T^#P#V#W${%O&gR&f$}#}![Vgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+V#}!XVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+V#|!ZVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VQ%}$cQ'w&OQ)x(hR*m)y#}!`Vgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+V#}!_Vgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+V#}!^Vgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VR$R!_R$Q!_R'p%sR'l%sR'q%sQ'm%sR)Z'lQ*V)PV*|*o*}+VQ'n%sS)Y'l'mR*^)ZX'k%s'l'm)ZR)W'kQ$^!lQ%y$_Q(f&vQ)U'kR)s(dQ)V'kQ*])UR+P*rV)S'k)U*rT*Z)S)XV)T'k)U*rR*Z)T#}!tVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+VR&^$r#}!uVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%P%R%k%r%y%|&Z&`&o'P'W'Z'['_'b'c'k'r't'|'}(P(c(e(f(i(j(k(p(x(z)P)U)])_)c)s)w*S*b*j*k*o*r*t*w*}+Q+V#a!fVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+VQ%u$UR)k(Y#a!gVgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+VQ$a!lQ%z$_Q(g&vR)t(dQ'u%|Q)`'tQ*l)wR*x*jQ$c!lR(h&vQ$f!lR(i&vS$e!l&vT%{$_(dX$o!s$m$p&TX$q!s$m$p&TR'|&[Q&Y$pR'y&TT&Z$p&TQ&X$pS'x&T&YR)d'yTbOeTfOeQeOR#[e$OmT`bgh{!O!c!s#q#u$O$Y$]$^$f$h$j$q$s%P%R%_%r%y%|&Z&n&o'P'W'Z'['_'k'r't'|'}(c(e(f(i(j(k(p(x(z)P)U)])_)c)o)s)w*S*b*j*k*o*r*t*u*v*w*}+Q+VbtV!T!w#z%k&`'b'c(PT#emtQ'P%PR(n'PQ#bkR%U#bj]O_eo!O#O#}%S%|'R't)w*jR!x]Q#trR%`#tQ#{!SU%l#{%m&aQ%m#|R&a$tQ#P^S$y#P%OR%O#WQ(U&dR)j(UQ'^%bU(y'^)b*sQ)b'vR*s*_Q*p*VR+O*pQ$p!sQ&T$mT&U$p&TQ'W%RR(s'WT'O%P'PX&{%P%R'P'WW&y%P%R'P'WR)|(kY&z%P%R'P'W(kR){(j[&v%P%R'P'W(j(kQ)v(fQ)z(iQ*i)sQ*y*kR+T*wf&t%P%R'P'W(f(i(j(k)s*k*wR)u(eh&u%P%R'P'W(e(f(i(j(k)s*k*wQ(a&oR)r(cm&p%P%R&o'P'W(c(e(f(i(j(k)s*k*wb!qV!T!w#z%k&`'b'c(PQ#]gQ#^hQ#y!OQ$m!sQ%b#uQ%q$OQ&[$qQ&_$sQ'f%rW'v%|'t)w*jQ'z&ZQ(v'ZQ(w'[^(|'_(z)c*S*b*t+QU)X'k)U*rQ)e'|Q)f'}Q*O(pQ*R(xW*W)P*o*}+VR*_)]!z!oVgh!O!T!s!w#u#z$O$q$s%k%r%|&Z&`'Z'['_'b'c'k't'|'}(P(p(x(z)P)U)])c)w*S*b*j*o*r*t*}+Q+VR&R$j!|!pVgh!O!T!s!w#u#z$O$j$q$s%k%r%|&Z&`'Z'['_'b'c'k't'|'}(P(p(x(z)P)U)])c)w*S*b*j*o*r*t*}+Q+VR&Q$h#O!lVgh!O!T!s!w#u#z$O$h$j$q$s%k%r%|&Z&`'Z'['_'b'c'k't'|'}(P(p(x(z)P)U)])c)w*S*b*j*o*r*t*}+Q+VQ%x$^Q&P$fQ's%yQ)^'rR*`)_#Y!jVgh!O!T!s!w#u#z$O$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+VR%w$]#[!kVgh!O!T!s!w#u#z$O$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+VQ#w{R%v$Y#a|Vgh{!O!T!s!w#u#z$O$Y$]$^$f$h$j$q$s%k%r%y%|&Z&`'Z'['_'b'c'k'r't'|'}(P(p(x(z)P)U)])_)c)w*S*b*j*o*r*t*}+Q+VRrTQ%]#qR']%_R$U!cT'V%R'W\",\n nodeNames:\n '\u26A0 Program TableStatement Kw Identifier table Ref ColumnDef ColumnName Kw date Kw timestamp Kw interval DataType TypeName ScalarType ArrayType Kw array < > PrimaryKey Kw primary_key JoinDef JoinType Kw join Kw one Kw many Kw as Alias Kw on BinaryExpression = ComputedDef OrExpression Kw or AndExpression Kw and BetweenExpression AddExpression AddOp + - || MultiplyExpression MulOp * / % UnaryExpression UnaryOperator Kw not TypeCastExpression :: CastType CaseExpression Kw case OrExpression AndExpression BetweenExpression AddExpression MultiplyExpression UnaryExpression TypeCastExpression ExistsExpression Kw exists QueryExpression WithClause Kw with CteDef SimpleQuery FromClause Kw from TableName Subquery SubqueryExpression JoinClause Kw inner Kw left Kw right Kw full Kw cross UnnestSource Kw unnest SelectClause Kw select Kw distinct SelectItem Wildcard WhereClause Kw where GroupByClause Kw group Kw by HavingClause Kw having SetOperator Kw union Kw all Kw intersect Kw except SetOperand OrderByClause Kw order OrderItem Number Kw asc Kw desc LimitClause Kw limit Kw offset String Boolean Kw true Kw false Null Kw null WindowExpression FunctionCall Count Kw count OverClause Kw over WindowSpec WindowPartitionClause Kw partition WindowOrderByClause WindowOrderItem WindowFrameClause Kw rows Kw range WindowFrameBetween Kw between WindowFrameBound Kw unbounded Kw preceding Kw following Kw current Kw row WindowFrameStart ExtractExpression Kw extract ExtractUnit CastExpression Kw cast IntervalExpression IntervalUnit DateExpression TimestampExpression Param Parenthetical InExpression Kw in InValueList NullTestExpression Kw is ComparisonExpression ComparisonOp != <> <= >= Kw like WhenClause Kw when Kw then ElseClause Kw else Kw end IntervalExpressionNoRef InExpression NullTestExpression ComparisonExpression : ViewStatement ExtendStatement Kw extend QueryStatement',\n maxTerm: 283,\n nodeProps: [\n [\n 'group',\n -3,\n 6,\n 137,\n 156,\n 'Expression Expression Expression',\n -5,\n 39,\n 90,\n 197,\n 202,\n 228,\n 'Expression',\n -32,\n 42,\n 45,\n 48,\n 49,\n 54,\n 59,\n 63,\n 66,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 147,\n 148,\n 153,\n 157,\n 158,\n 190,\n 194,\n 199,\n 200,\n 201,\n 203,\n 207,\n 210,\n 229,\n 230,\n 231,\n 'Expression Expression',\n -2,\n 88,\n 89,\n 'TablePrimary TablePrimary',\n 102,\n 'TablePrimary',\n ],\n ],\n skippedNodes: [0],\n repeatNodeCount: 13,\n tokenData:\n \"+Y~RqX^#Ypq#Yqr#}rs$Yst$wtu%`uv&Qwx&Vxy&oyz&tz{&y{|'O|}'T}!O'Y!O!P'b!P!Q'g!Q![(v![!])a!]!^)n!^!_)s!_!`*Y!`!a*_!c!}*l#T#o*l#p#q*}#y#z#Y$f$g#Y#BY#BZ#Y$IS$I_#Y$I|$JO#Y$JT$JU#Y$KV$KW#Y&FU&FV#Y~#_Y&g~X^#Ypq#Y#y#z#Y$f$g#Y#BY#BZ#Y$IS$I_#Y$I|$JO#Y$JT$JU#Y$KV$KW#Y&FU&FV#Y~$QP!_!`$T~$YO%l~~$]TOr$Yrs$ls;'S$Y;'S;=`$q<%lO$Y~$qO$X~~$tP;=`<%l$Y~$|S&h~OY$wZ;'S$w;'S;=`%Y<%lO$w~%]P;=`<%l$w~%cS!Q![%o!c!}%o#R#S%o#T#o%o~%tS%a~!Q![%o!c!}%o#R#S%o#T#o%o~&VO![~~&YTOw&Vwx$lx;'S&V;'S;=`&i<%lO&V~&lP;=`<%l&V~&tO&j~~&yO&|~~'OO!Y~~'TO!T~~'YO&}~~'_P!U~}!O$w~'gO&i~~'lP!Z~z{'o~'rTOz'oz{(R{;'S'o;'S;=`(p<%lO'o~(UVOz'oz{(R{!P'o!P!Q(k!Q;'S'o;'S;=`(p<%lO'o~(pO&h~~(sP;=`<%l'o~({Q#}~!O!P)R!Q![(v~)UP!Q![)X~)^P#}~!Q![)X~)fP&Q~![!])i~)nO!b~~)sO'U~~)xQe~!_!`*O!`!a*T~*TO%n~~*YO%m~~*_Ox~~*dPf~!_!`*g~*lO%o~~*qSS~!Q![*l!c!}*l#R#S*l#T#o*l~+QP#p#q+T~+YO!V~\",\n tokenizers: [0],\n topRules: {Program: [0, 1]},\n specialized: [\n {term: 4, get: (value, stack) => specializeIdentifier(value, stack) << 1, external: specializeIdentifier},\n {term: 4, get: value => spec_Identifier[value] || -1},\n ],\n tokenPrec: 5508,\n})\n", "// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const Program = 1,\n TableStatement = 2,\n Identifier = 4,\n table = 5,\n Ref = 6,\n ColumnDef = 7,\n ColumnName = 8,\n date = 10,\n timestamp = 12,\n interval = 14,\n DataType = 15,\n TypeName = 16,\n ScalarType = 17,\n ArrayType = 18,\n array = 20,\n PrimaryKey = 23,\n primary_key = 25,\n JoinDef = 26,\n JoinType = 27,\n join = 29,\n one = 31,\n many = 33,\n as = 35,\n Alias = 36,\n on = 38,\n JoinCondition = 39,\n ComputedDef = 41,\n or = 44,\n and = 47,\n AddOp = 50,\n MulOp = 55,\n UnaryOperator = 60,\n not = 62,\n CastType = 65,\n CaseExpression = 66,\n _case = 68,\n ExistsExpression = 76,\n exists = 78,\n QueryExpression = 79,\n WithClause = 80,\n _with = 82,\n CteDef = 83,\n SimpleQuery = 84,\n FromClause = 85,\n from = 87,\n TableName = 88,\n Subquery = 89,\n SubqueryExpression = 90,\n JoinClause = 91,\n inner = 93,\n left = 95,\n right = 97,\n full = 99,\n cross = 101,\n UnnestSource = 102,\n unnest = 104,\n SelectClause = 105,\n select = 107,\n distinct = 109,\n SelectItem = 110,\n Wildcard = 111,\n WhereClause = 112,\n where = 114,\n GroupByClause = 115,\n group = 117,\n by = 119,\n HavingClause = 120,\n having = 122,\n SetOperator = 123,\n union = 125,\n all = 127,\n intersect = 129,\n except = 131,\n SetOperand = 132,\n OrderByClause = 133,\n order = 135,\n OrderItem = 136,\n Number = 137,\n asc = 139,\n desc = 141,\n LimitClause = 142,\n limit = 144,\n offset = 146,\n String = 147,\n Boolean = 148,\n _true = 150,\n _false = 152,\n Null = 153,\n _null = 155,\n WindowExpression = 156,\n FunctionCall = 157,\n Count = 158,\n count = 160,\n OverClause = 161,\n over = 163,\n WindowSpec = 164,\n WindowPartitionClause = 165,\n partition = 167,\n WindowOrderByClause = 168,\n WindowOrderItem = 169,\n WindowFrameClause = 170,\n rows = 172,\n range = 174,\n WindowFrameBetween = 175,\n between = 177,\n WindowFrameBound = 178,\n unbounded = 180,\n preceding = 182,\n following = 184,\n current = 186,\n row = 188,\n WindowFrameStart = 189,\n ExtractExpression = 190,\n extract = 192,\n ExtractUnit = 193,\n CastExpression = 194,\n cast = 196,\n IntervalExpression = 197,\n IntervalUnit = 198,\n DateExpression = 199,\n TimestampExpression = 200,\n Param = 201,\n Parenthetical = 202,\n _in = 205,\n InValueList = 206,\n is = 209,\n ComparisonOp = 211,\n like = 217,\n WhenClause = 218,\n when = 220,\n then = 222,\n ElseClause = 223,\n _else = 225,\n end = 227,\n IntervalExpressionNoRef = 228,\n ViewStatement = 233,\n ExtendStatement = 234,\n extend = 236,\n QueryStatement = 237\n", "// Import token IDs from the generated parser\nimport {\n select,\n not,\n _true,\n _false,\n _null,\n like,\n between,\n _in,\n is,\n and,\n or,\n as,\n from,\n inner,\n left,\n right,\n full,\n cross,\n unnest,\n join,\n on,\n where,\n group,\n by,\n order,\n asc,\n desc,\n limit,\n offset,\n table,\n exists,\n primary_key,\n interval,\n date,\n timestamp,\n _case,\n when,\n then,\n _else,\n end,\n count,\n extract,\n cast,\n array,\n distinct,\n union,\n all,\n intersect,\n except,\n having,\n one,\n many,\n extend,\n _with,\n over,\n partition,\n rows,\n range,\n preceding,\n following,\n current,\n row,\n unbounded,\n} from './parser.terms.js'\n\n// Map of lowercase keywords to their token IDs\nconst keywords = {\n select: select,\n not: not,\n true: _true,\n false: _false,\n null: _null,\n like: like,\n between: between,\n in: _in,\n is: is,\n and: and,\n or: or,\n as: as,\n from: from,\n inner: inner,\n left: left,\n right: right,\n full: full,\n cross: cross,\n unnest: unnest,\n join: join,\n on: on,\n where: where,\n group: group,\n by: by,\n order: order,\n asc: asc,\n desc: desc,\n limit: limit,\n offset: offset,\n table: table,\n exists: exists,\n primary_key: primary_key,\n interval: interval,\n date: date,\n timestamp: timestamp,\n case: _case,\n when: when,\n then: then,\n else: _else,\n end: end,\n count: count,\n extract: extract,\n cast: cast,\n array: array,\n distinct: distinct,\n union: union,\n all: all,\n intersect: intersect,\n except: except,\n having: having,\n one: one,\n many: many,\n extend: extend,\n with: _with,\n over: over,\n partition: partition,\n rows: rows,\n range: range,\n preceding: preceding,\n following: following,\n current: current,\n row: row,\n unbounded: unbounded,\n}\n\nexport function specializeIdentifier(value) {\n let lower = value.toLowerCase()\n return keywords[lower] || -1\n}\n", "export interface SveltishAttribute {\n key: string\n keyStart: number\n keyEnd: number\n value: string\n start: number\n end: number\n}\n\n/**\n * Extract attributes from the self-closing Svelte-ish component tags we support in markdown.\n *\n * This is intentionally a small scanner rather than a full Svelte parser. The markdown analysis path\n * only needs static attributes from tags like `<BarChart data=foo x=\"month\" label />` so it can:\n * - translate chart field props into virtual GSQL and map field errors back to the prop value\n * - report unsupported wrapper props and underline the prop name\n *\n * A regex used to be enough when we only supported `key=\"value\"`, but real markdown commonly uses\n * unquoted props, single-quoted props, and boolean props. We also skip `{...}` / `{expr}` chunks so\n * dynamic Svelte syntax does not get mistaken for a static attribute. This is not intended to validate\n * arbitrary Svelte syntax; it just recognizes the static subset Graphene can analyze.\n */\nexport function extractSveltishAttributes(fragment: string, baseStart: number): Record<string, SveltishAttribute> {\n let attrs: Record<string, SveltishAttribute> = {}\n\n let name = fragment.match(/^<([A-Z][A-Za-z0-9]*)/)?.[1]\n let i = name ? name.length + 1 : 1\n while (i < fragment.length) {\n i = skipWhitespace(fragment, i)\n if (!fragment[i] || fragment[i] == '/' || fragment[i] == '>') break\n\n if (fragment[i] == '{') {\n i = skipSvelteExpression(fragment, i)\n continue\n }\n\n if (!/[\\w:-]/.test(fragment[i])) {\n i++\n continue\n }\n\n let key = readAttributeKey(fragment, i)\n i = skipWhitespace(fragment, key.end)\n let value = readAttributeValue(fragment, i, key.start, key.end)\n i = value.next\n\n attrs[key.value] = {\n key: key.value,\n keyStart: baseStart + key.start,\n keyEnd: baseStart + key.end,\n value: value.value,\n start: baseStart + value.start,\n end: baseStart + value.end,\n }\n }\n return attrs\n}\n\nfunction skipWhitespace(fragment: string, i: number) {\n while (/\\s/.test(fragment[i] || '')) i++\n return i\n}\n\nfunction skipSvelteExpression(fragment: string, i: number) {\n while (fragment[i] && fragment[i] != '}') i++\n return fragment[i] == '}' ? i + 1 : i\n}\n\nfunction readAttributeKey(fragment: string, start: number) {\n let end = start\n while (/[\\w:-]/.test(fragment[end] || '')) end++\n return {value: fragment.slice(start, end), start, end}\n}\n\nfunction readAttributeValue(fragment: string, i: number, keyStart: number, keyEnd: number) {\n if (fragment[i] != '=') return {value: 'true', start: keyStart, end: keyEnd, next: i}\n\n i = skipWhitespace(fragment, i + 1)\n let quote = fragment[i] == '\"' || fragment[i] == \"'\" ? fragment[i] : ''\n if (!quote) return readUnquotedValue(fragment, i)\n\n let start = i + 1\n let end = start\n while (fragment[end] && fragment[end] != quote) end++\n return {value: fragment.slice(start, end), start, end, next: fragment[end] == quote ? end + 1 : end}\n}\n\nfunction readUnquotedValue(fragment: string, start: number) {\n let end = start\n while (fragment[end] && !/\\s/.test(fragment[end]) && fragment[end] != '/' && fragment[end] != '>') end++\n return {value: fragment.slice(start, end), start, end, next: end}\n}\n", "import type {ParsedFileArtifacts, ParsedFileDiagnostic, WorkspaceFileInput} from './types.ts'\n\nimport {unsupportedChartProps} from './chartProps.ts'\nimport {parser} from './parser.js'\nimport {extractSveltishAttributes, type SveltishAttribute} from './sveltish.ts'\n\n// This parser turns Graphene md files into the equivalent gsql, and then parses that gsql.\n// Code fences are turned in to table definitions, while Component calls are turned into queries.\n// so:\n// ```gsql test_table\n// from users where age > 20\n// ```\n// <BarChart data=\"test_table\" x=\"name\" y=\"avg(age)\" />\n//\n// becomes:\n// table test_table as (from users where age > 20)\n// from test_table select name, avg(age)\n//\n// Only components with a `data` attribute get turned into queries, and only attributes in a static list are fields to select.\n\nconst COMPONENT_ATTRIBUTE_KEYS = ['x', 'y', 'y2', 'value', 'category', 'splitBy', 'sort'] as const\ntype ComponentAttributeKey = (typeof COMPONENT_ATTRIBUTE_KEYS)[number]\nconst DEFAULT_FIELD_ATTRIBUTE_KEYS: ComponentAttributeKey[] = ['x', 'y', 'y2', 'value', 'category']\nconst COMPONENT_FIELD_ATTRIBUTE_KEYS: Record<string, ComponentAttributeKey[]> = {\n BarChart: ['x', 'y', 'y2', 'splitBy', 'sort'],\n AreaChart: ['x', 'y', 'y2', 'splitBy', 'sort'],\n PieChart: ['category', 'value'],\n LineChart: ['x', 'y', 'y2', 'splitBy', 'sort'],\n ScatterPlot: ['x', 'y', 'splitBy'],\n}\n\nconst FENCE = /^([ \\t]*)(`{3,})([^\\n]*)\\n([\\s\\S]*?)^\\1\\2[ \\t]*$/gim\nconst COMPONENT_TAG = /<([A-Z][A-Za-z0-9]*)\\s+(?:[^>\"']|\"[^\"]*\"|'[^']*')*\\/>/g\n\ninterface FenceMatch {\n start: number\n end: number\n headerLength: number\n contentStart: number\n content: string\n gsql: boolean\n name?: string\n nameStart?: number\n}\n\ninterface ComponentMatch {\n start: number\n end: number\n data: SveltishAttribute | null\n attributes: Partial<Record<ComponentAttributeKey, SveltishAttribute>>\n diagnostics: ParsedFileDiagnostic[]\n}\n\nexport function parseMarkdown(file: WorkspaceFileInput): ParsedFileArtifacts {\n let source = file.contents\n let fences = collectFences(source)\n let gsqlFences = fences.filter(f => f.gsql)\n let components = collectComponents(source, fences)\n let events = [...gsqlFences, ...components].sort((a, b) => a.start - b.start)\n let diagnostics = components.flatMap(component => component.diagnostics)\n\n let virtual: string[] = []\n let mapping: number[] = []\n let cursor = 0\n let lastMapped = -1\n let maxOffset = source.length\n\n let push = (ch: string, target: number) => {\n let mapped = target\n if (mapped <= lastMapped) mapped = lastMapped + 1\n if (mapped > maxOffset) mapped = maxOffset\n virtual.push(ch)\n mapping.push(mapped)\n lastMapped = mapped\n }\n\n let resetLast = (value: number) => {\n lastMapped = value\n }\n\n let appendWhitespace = (start: number, end: number) => {\n resetLast(start - 1)\n for (let i = start; i < end; i++) {\n let ch = source[i]\n push(ch === '\\n' || ch === '\\r' ? ch : ' ', i)\n }\n }\n\n let appendMapped = (text: string, mapFn: (i: number) => number, options?: {reset?: number}) => {\n if (options?.reset !== undefined) resetLast(options.reset)\n for (let i = 0; i < text.length; i++) {\n push(text[i], mapFn(i))\n }\n }\n\n let appendContent = (text: string, contentStart: number) => {\n resetLast(contentStart - 1)\n for (let i = 0; i < text.length; i++) {\n let target = contentStart + i\n virtual.push(text[i])\n mapping.push(target)\n lastMapped = target\n }\n }\n\n for (let event of events) {\n if (event.start < cursor) continue\n appendWhitespace(cursor, event.start)\n cursor = event.start\n\n if (isFence(event)) {\n let fence = event\n let contentStart = fence.contentStart\n let content = fence.content\n if (fence.name) {\n let name = fence.name\n appendMapped('table ', () => fence.start, {reset: fence.start - 1})\n let nameStart = fence.nameStart ?? contentStart\n appendMapped(name, i => nameStart + i, {reset: nameStart - 1})\n appendMapped(' ', () => nameStart + name.length, {reset: nameStart + name.length - 1})\n appendMapped('as (\\n', () => contentStart, {reset: contentStart - 1})\n appendContent(content, contentStart)\n if (!content.endsWith('\\n')) appendMapped('\\n', () => contentStart + content.length, {reset: contentStart + content.length - 1})\n appendMapped(')\\n', () => fence.end - 1, {reset: fence.end - 2})\n } else {\n appendContent(content, contentStart)\n }\n cursor = fence.end\n continue\n }\n\n let component = event as ComponentMatch\n let {data, attributes} = component\n let hasComponentAttribute = COMPONENT_ATTRIBUTE_KEYS.some(key => attributes[key] !== undefined)\n if (data && hasComponentAttribute) {\n appendMapped('from ', () => component.start, {reset: component.start - 1})\n appendMapped(data.value, (i: number) => data.start + i, {reset: data.start - 1})\n appendMapped(' select ', () => component.start)\n\n let previousAttr: SveltishAttribute | null = null\n let selectedValues = new Set<string>()\n for (let key of COMPONENT_ATTRIBUTE_KEYS) {\n let attribute = attributes[key]\n if (!attribute) continue\n if (selectedValues.has(attribute.value)) continue\n if (previousAttr) {\n let prevEnd = previousAttr.start + previousAttr.value.length\n appendMapped(', ', () => prevEnd)\n }\n appendMapped(attribute.value, (i: number) => attribute.start + i, {reset: attribute.start - 1})\n previousAttr = attribute\n selectedValues.add(attribute.value)\n }\n\n let lastAttr = previousAttr\n let selectEnd = lastAttr ? lastAttr.start + lastAttr.value.length : data.start + data.value.length\n let resetPoint = lastAttr ? lastAttr.start + lastAttr.value.length - 1 : data.start + data.value.length - 1\n appendMapped(\n ';\\n',\n (i: number) => {\n if (i === 0) return selectEnd\n return component.end\n },\n {reset: resetPoint},\n )\n }\n cursor = component.end\n }\n\n appendWhitespace(cursor, source.length)\n\n let doc = virtual.join('')\n return {\n tree: parser.parse(doc),\n virtualContents: doc,\n virtualToMarkdownOffset: [...mapping, source.length],\n diagnostics,\n }\n}\n\nfunction collectFences(source: string): FenceMatch[] {\n let matches: FenceMatch[] = []\n FENCE.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = FENCE.exec(source))) {\n let start = match.index ?? 0\n let full = match[0]\n let headerLength = full.indexOf('\\n')\n if (headerLength === -1) continue\n headerLength += 1\n let language = (match[3] || '').trim().split(/\\s+/)[0]?.toLowerCase()\n let gsql = language == 'sql' || language == 'gsql'\n let content = match[4] || ''\n let contentStart = start + headerLength\n let {name, index} = extractFenceName(full.slice(0, headerLength))\n matches.push({start, end: start + full.length, headerLength, contentStart, content, gsql, name, nameStart: index == null ? undefined : start + index})\n }\n return matches\n}\n\nfunction collectComponents(source: string, fences: FenceMatch[]): ComponentMatch[] {\n let matches: ComponentMatch[] = []\n COMPONENT_TAG.lastIndex = 0\n let match: RegExpExecArray | null\n while ((match = COMPONENT_TAG.exec(source))) {\n let start = match.index ?? 0\n let end = start + match[0].length\n if (isInsideFence(start, fences)) continue\n let componentName = match[1]\n let attrs = extractSveltishAttributes(match[0], start)\n let attributeMatches: Partial<Record<ComponentAttributeKey, SveltishAttribute>> = {}\n for (let key of fieldAttributeKeys(componentName)) {\n if (attrs[key]) attributeMatches[key] = normalizeFieldAttribute(key, attrs[key])\n }\n matches.push({start, end, data: attrs.data || null, attributes: attributeMatches, diagnostics: validateChartProps(componentName, attrs)})\n }\n return matches\n}\n\nfunction fieldAttributeKeys(componentName: string): ComponentAttributeKey[] {\n return COMPONENT_FIELD_ATTRIBUTE_KEYS[componentName] || DEFAULT_FIELD_ATTRIBUTE_KEYS\n}\n\nfunction extractFenceName(header: string): {name?: string; index?: number} {\n let parts = header.trim().split(/\\s+/)\n if (parts.length > 1) return {name: parts[1], index: header.indexOf(parts[1])}\n return {}\n}\n\nfunction normalizeFieldAttribute(key: ComponentAttributeKey, attr: SveltishAttribute): SveltishAttribute {\n if (key != 'sort') return attr\n let match = attr.value.match(/\\S+/)\n if (!match) return attr\n let offset = match.index ?? 0\n return {...attr, value: match[0], start: attr.start + offset, end: attr.start + offset + match[0].length}\n}\n\nfunction validateChartProps(componentName: string, attrs: Record<string, SveltishAttribute>): ParsedFileDiagnostic[] {\n let propValues = Object.fromEntries(Object.values(attrs).map(attr => [attr.key, attr.value]))\n return unsupportedChartProps(componentName, propValues).map(unsupported => {\n let attr = attrs[unsupported.prop]\n return {message: unsupported.message, from: attr.keyStart, to: attr.keyEnd}\n })\n}\n\nfunction isInsideFence(offset: number, fences: FenceMatch[]) {\n return fences.some(f => offset >= f.start && offset < f.end)\n}\n\nfunction isFence(event: FenceMatch | ComponentMatch): event is FenceMatch {\n return (event as FenceMatch).content !== undefined\n}\n", "import type {SyntaxNode} from '@lezer/common'\n\nimport {getFile} from './util.ts'\n\nlet embeddedMetadataPair = /(^|\\s)(#)([A-Za-z0-9_-]+)(?:\\s*=\\s*(\"(?:[^\"\\\\]|\\\\.)*\"|[^\\s#]+)|(?=(?:\\s*(?:#|--|$))))/g\n\ntype CommentKind = 'dash' | 'hash'\nexport type MetadataEntry = {\n key: string\n value: string\n rawValue?: string\n from: number\n to: number\n valueFrom?: number\n valueTo?: number\n hasValue: boolean\n}\n\nexport type MetadataDiagnostic = {\n message: string\n from: number\n to: number\n}\n\nlet isoCurrencyCodes = new Set(Intl.supportedValuesOf('currency').map(code => code.toLowerCase()))\n\nlet metadataKeyRules = {\n ratio: {kind: 'flag'},\n pct: {kind: 'flag'},\n pii: {kind: 'flag'},\n currency: {kind: 'currency'},\n unit: {kind: 'string'},\n timeGrain: {kind: 'enum', values: ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second']},\n timeOrdinal: {kind: 'enum', values: ['hour_of_day', 'day_of_month', 'day_of_year', 'week_of_year', 'month_of_year', 'quarter_of_year', 'dow_0s', 'dow_1s', 'dow_1m']},\n description: {kind: 'string'},\n} as const\n\nlet validMetadataKeys = Object.keys(metadataKeyRules)\n\n// Extract metadata from comments that appear directly above a syntax node.\n// Rules:\n// - `#` lines are metadata-only comments and may contain multiple `#key` / `#key=value` entries.\n// - `--` lines are description comments, but may embed trailing `#key` / `#key=value` metadata.\n// - Legacy `--# key=value` lines are ignored.\n// - Adjacency required: we scan upward; a blank or non-comment line stops the scan.\n// - If the node is not the first token on its line, ignore leading comments.\nexport function extractLeadingMetadata(node: SyntaxNode): Record<string, string> {\n return extractLeadingMetadataDetails(node).metadata\n}\n\nexport function extractLeadingMetadataDetails(node: SyntaxNode): {metadata: Record<string, string>; entries: MetadataEntry[]} {\n let src = getFile(node).contents\n if (!src) return {metadata: {}, entries: []}\n\n let pos = node.from\n let currentLineStart = src.lastIndexOf('\\n', Math.max(0, pos - 1)) + 1\n let endOfPrevLine = currentLineStart - 1\n let beforeOnLine = src.slice(currentLineStart, pos)\n let isFirstTokenOnLine = !/[^\\s]/.test(beforeOnLine)\n\n let comments: {kind: CommentKind; text: string; from: number; markerFrom: number}[] = []\n if (isFirstTokenOnLine && endOfPrevLine >= 0) {\n let cursor = endOfPrevLine\n while (cursor >= 0) {\n let startOfLine = src.lastIndexOf('\\n', Math.max(0, cursor - 1)) + 1\n let line = src.slice(startOfLine, cursor)\n let trimmed = line.trim()\n if (!trimmed) break\n let comment = parseCommentLine(line, startOfLine)\n if (!comment) break\n comments.push(comment)\n cursor = startOfLine - 1\n }\n }\n comments.reverse()\n\n let metadata: Record<string, string> = {}\n let descriptionLines: string[] = []\n let entries: MetadataEntry[] = []\n for (let comment of comments) consumeComment(comment, metadata, descriptionLines, entries)\n\n let endPos = node.to\n let endOfLine = src.indexOf('\\n', endPos)\n if (endOfLine === -1) endOfLine = src.length\n let after = src.slice(endPos, endOfLine)\n let trailing = parseTrailingComment(after, endPos)\n if (trailing) consumeComment(trailing, metadata, descriptionLines, entries)\n\n if (descriptionLines.length) metadata.description = descriptionLines.join(' ')\n return {metadata, entries}\n}\n\nexport function validateMetadataEntries(entries: MetadataEntry[]): MetadataDiagnostic[] {\n let diagnostics: MetadataDiagnostic[] = []\n for (let entry of entries) {\n let rule = metadataKeyRules[entry.key as keyof typeof metadataKeyRules]\n if (!rule) {\n diagnostics.push({\n message: `Unknown metadata key \"#${entry.key}\". Expected one of: ${validMetadataKeys.join(', ')}`,\n from: entry.from,\n to: entry.to,\n })\n continue\n }\n\n if (rule.kind == 'flag') {\n if (!entry.hasValue || entry.rawValue == 'true') continue\n diagnostics.push({\n message: `Metadata \"#${entry.key}\" is a flag; use \"#${entry.key}\" or \"#${entry.key}=true\".`,\n from: entry.valueFrom ?? entry.from,\n to: entry.valueTo ?? entry.to,\n })\n continue\n }\n\n if (rule.kind == 'string') {\n if (entry.hasValue && entry.value.trim()) continue\n diagnostics.push({\n message: `Metadata \"#${entry.key}\" requires a value.`,\n from: entry.from,\n to: entry.to,\n })\n continue\n }\n\n if (rule.kind == 'currency') {\n if (!entry.hasValue || !entry.value.trim()) {\n diagnostics.push({\n message: 'Metadata \"#currency\" requires a value.',\n from: entry.from,\n to: entry.to,\n })\n continue\n }\n if (isoCurrencyCodes.has(entry.value.toLowerCase())) continue\n diagnostics.push({\n message: `Invalid value \"${entry.value}\" for \"#currency\". Expected an ISO 4217 currency code.`,\n from: entry.valueFrom ?? entry.from,\n to: entry.valueTo ?? entry.to,\n })\n continue\n }\n\n if (rule.values.includes(entry.value as never)) continue\n diagnostics.push({\n message: `Invalid value \"${entry.value}\" for \"#${entry.key}\". Expected one of: ${rule.values.join(', ')}`,\n from: entry.valueFrom ?? entry.from,\n to: entry.valueTo ?? entry.to,\n })\n }\n return diagnostics\n}\n\nfunction parseCommentLine(line: string, lineStart: number): {kind: CommentKind; text: string; from: number; markerFrom: number} | undefined {\n let leading = line.match(/^\\s*/)?.[0].length || 0\n let markerFrom = lineStart + leading\n let trimmed = line.slice(leading)\n if (trimmed.startsWith('--')) return withTrimmedText('dash', line, lineStart, markerFrom, leading + 2)\n if (trimmed.startsWith('#')) return withTrimmedText('hash', line, lineStart, markerFrom, leading + 1)\n}\n\nfunction parseTrailingComment(after: string, afterStart: number): {kind: CommentKind; text: string; from: number; markerFrom: number} | undefined {\n let dashIdx = after.indexOf('--')\n let hashIdx = after.indexOf('#')\n let commentIdx = minNonNegative(dashIdx, hashIdx)\n if (commentIdx === -1) return undefined\n\n let between = after.slice(0, commentIdx)\n if (!/^[\\s,]*$/.test(between)) return undefined\n\n let markerFrom = afterStart + commentIdx\n if (hashIdx !== -1 && hashIdx === commentIdx) return withTrimmedText('hash', after, afterStart, markerFrom, hashIdx + 1)\n return withTrimmedText('dash', after, afterStart, markerFrom, dashIdx + 2)\n}\n\nfunction withTrimmedText(kind: CommentKind, raw: string, rawFrom: number, markerFrom: number, textStart: number) {\n let whitespace = raw.slice(textStart).match(/^\\s*/)?.[0].length || 0\n return {kind, text: raw.slice(textStart + whitespace), from: rawFrom + textStart + whitespace, markerFrom}\n}\n\nfunction consumeComment(comment: {kind: CommentKind; text: string; from: number; markerFrom: number}, metadata: Record<string, string>, descriptionLines: string[], entries: MetadataEntry[]) {\n if (comment.kind === 'hash') {\n let cleaned = extractHashMetadata(comment, metadata, entries)\n let trailingDescription = parseHashCommentDescription(cleaned)\n if (trailingDescription) descriptionLines.push(trailingDescription)\n return\n }\n\n // `--# ...` was the old metadata syntax. Do not keep it working.\n if (comment.text.startsWith('#')) return\n\n let description = extractMetadataPairs(comment.text, comment.from, metadata, entries)\n if (description) descriptionLines.push(description)\n}\n\nfunction extractHashMetadata(comment: {text: string; from: number; markerFrom: number}, metadata: Record<string, string>, entries: MetadataEntry[]) {\n let text = comment.text\n let cursor = skipWhitespace(text, 0)\n let pair = matchMetadataToken(text, cursor, false, comment.from, comment.markerFrom)\n if (!pair) return text.trim()\n\n consumePair(pair, metadata, entries)\n cursor = pair.end\n\n while (true) {\n let nextStart = skipWhitespace(text, cursor)\n if (text[nextStart] !== '#') return text.slice(nextStart).trim()\n let nextPair = matchMetadataToken(text, nextStart, true, comment.from)\n if (!nextPair) return text.slice(nextStart).trim()\n consumePair(nextPair, metadata, entries)\n cursor = nextPair.end\n }\n}\n\nfunction extractMetadataPairs(text: string, textFrom: number, metadata: Record<string, string>, entries: MetadataEntry[]) {\n let cleaned = text.replace(embeddedMetadataPair, (match, leadingSpace, _hash, key, rawValue, offset) => {\n if (key) {\n let hashStart = textFrom + offset + leadingSpace.length\n let valueOffset = rawValue ? match.indexOf(rawValue) : -1\n consumePair(\n {\n key,\n rawValue,\n keyFrom: hashStart + 1,\n keyTo: hashStart + 1 + key.length,\n from: hashStart,\n to: hashStart + 1 + key.length,\n valueFrom: valueOffset >= 0 ? textFrom + offset + valueOffset : undefined,\n valueTo: valueOffset >= 0 ? textFrom + offset + valueOffset + rawValue.length : undefined,\n end: offset + match.length,\n },\n metadata,\n entries,\n )\n }\n return leadingSpace ? ' ' : ''\n })\n return cleaned.replace(/\\s+/g, ' ').trim()\n}\n\nfunction consumePair(pair: MetadataToken, metadata: Record<string, string>, entries: MetadataEntry[]) {\n let value = parseMetadataValue(pair.rawValue)\n metadata[pair.key] = value\n entries.push({\n key: pair.key,\n value,\n rawValue: pair.rawValue,\n from: pair.from,\n to: pair.to,\n valueFrom: pair.valueFrom,\n valueTo: pair.valueTo,\n hasValue: pair.rawValue != null,\n })\n}\n\nfunction parseMetadataValue(rawValue?: string) {\n if (!rawValue) return 'true'\n if (!rawValue.startsWith('\"')) return rawValue\n return rawValue.slice(1, -1).replace(/\\\\([\"\\\\])/g, '$1')\n}\n\nfunction parseHashCommentDescription(cleaned: string) {\n if (!cleaned.startsWith('--')) return undefined\n let description = cleaned.slice(2).trim()\n return description || undefined\n}\n\ntype MetadataToken = {\n key: string\n rawValue?: string\n keyFrom: number\n keyTo: number\n from: number\n to: number\n valueFrom?: number\n valueTo?: number\n end: number\n}\n\nfunction matchMetadataToken(text: string, start: number, hasHashPrefix: boolean, textFrom: number, firstHashFrom?: number): MetadataToken | undefined {\n let cursor = hasHashPrefix ? start + 1 : start\n let keyStart = cursor\n while (/[A-Za-z0-9_-]/.test(text[cursor] || '')) cursor++\n if (cursor === keyStart) return undefined\n\n let key = text.slice(keyStart, cursor)\n let from = hasHashPrefix ? textFrom + start : (firstHashFrom ?? textFrom + keyStart)\n let keyFrom = textFrom + keyStart\n let keyTo = textFrom + cursor\n let afterKey = skipWhitespace(text, cursor)\n if (text[afterKey] === '=') {\n let valueStart = skipWhitespace(text, afterKey + 1)\n let value = readMetadataValue(text, valueStart)\n if (!value) return undefined\n return {key, rawValue: value.rawValue, keyFrom, keyTo, from, to: keyTo, valueFrom: textFrom + valueStart, valueTo: textFrom + value.end, end: value.end}\n }\n\n if (afterKey >= text.length || text[afterKey] === '#' || text.startsWith('--', afterKey)) {\n return {key, rawValue: undefined, keyFrom, keyTo, from, to: keyTo, end: afterKey}\n }\n}\n\nfunction readMetadataValue(text: string, start: number) {\n if (!text[start]) return undefined\n if (text[start] === '\"') {\n let cursor = start + 1\n while (cursor < text.length) {\n if (text[cursor] === '\\\\') {\n cursor += 2\n continue\n }\n if (text[cursor] === '\"') return {rawValue: text.slice(start, cursor + 1), end: cursor + 1}\n cursor++\n }\n return undefined\n }\n\n let cursor = start\n while (cursor < text.length && !/[\\s#]/.test(text[cursor])) cursor++\n if (cursor === start) return undefined\n return {rawValue: text.slice(start, cursor), end: cursor}\n}\n\nfunction skipWhitespace(text: string, start: number) {\n let cursor = start\n while (/\\s/.test(text[cursor] || '')) cursor++\n return cursor\n}\n\nfunction minNonNegative(...values: number[]) {\n let next = values.filter(value => value >= 0)\n return next.length ? Math.min(...next) : -1\n}\n", "import {scalarType, type FieldType, type Expr} from './types.ts'\n\nexport type TimestampUnit = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'\n\nexport type TemporalLiteral = {\n literal: string\n timeframe: 'year' | 'month' | 'day' | 'hour' | 'minute' | 'second'\n type: FieldType\n}\n\nexport function parseTemporalLiteral(value: string, expected: string): TemporalLiteral | null {\n let raw = (value ?? '').trim()\n if (!raw) return null\n\n let yearMatch = raw.match(/^([0-9]{4})$/)\n if (yearMatch) {\n let year = Number(yearMatch[1])\n return buildResult(year, 1, 1, 0, 0, 0, 'year', expected)\n }\n\n let yearMonthMatch = raw.match(/^([0-9]{4})-([0-9]{2})$/)\n if (yearMonthMatch) {\n let year = Number(yearMonthMatch[1])\n let month = Number(yearMonthMatch[2])\n if (!inRange(month, 1, 12)) return null\n return buildResult(year, month, 1, 0, 0, 0, 'month', expected)\n }\n\n let dateMatch = raw.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/)\n if (dateMatch) {\n let year = Number(dateMatch[1])\n let month = Number(dateMatch[2])\n let day = Number(dateMatch[3])\n if (!isValidDate(year, month, day)) return null\n return buildResult(year, month, day, 0, 0, 0, 'day', expected)\n }\n\n if (expected === 'timestamp') {\n let dateTimeMatch = raw.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})[Tt\\s]([0-9]{1,2})(?::([0-9]{2})(?::([0-9]{2}))?)?$/)\n if (!dateTimeMatch) return null\n let year = Number(dateTimeMatch[1])\n let month = Number(dateTimeMatch[2])\n let day = Number(dateTimeMatch[3])\n if (!isValidDate(year, month, day)) return null\n\n let hour = Number(dateTimeMatch[4])\n let minute = dateTimeMatch[5] ? Number(dateTimeMatch[5]) : 0\n let second = dateTimeMatch[6] ? Number(dateTimeMatch[6]) : 0\n if (!inRange(hour, 0, 23) || !inRange(minute, 0, 59) || !inRange(second, 0, 59)) return null\n\n let timeframe: TemporalLiteral['timeframe'] = 'hour'\n if (dateTimeMatch[6]) {\n timeframe = 'second'\n } else if (dateTimeMatch[5]) {\n timeframe = 'minute'\n }\n\n return buildResult(year, month, day, hour, minute, second, timeframe, expected)\n }\n\n return null\n}\n\nconst INTERVAL_UNITS: Record<string, TimestampUnit> = {\n second: 'second',\n seconds: 'second',\n sec: 'second',\n secs: 'second',\n minute: 'minute',\n minutes: 'minute',\n min: 'minute',\n mins: 'minute',\n hour: 'hour',\n hours: 'hour',\n hr: 'hour',\n hrs: 'hour',\n day: 'day',\n days: 'day',\n week: 'week',\n weeks: 'week',\n month: 'month',\n months: 'month',\n quarter: 'quarter',\n quarters: 'quarter',\n year: 'year',\n years: 'year',\n}\n\nexport interface IntervalLiteral {\n quantity: number\n unit: TimestampUnit\n}\n\nexport function parseIntervalLiteral(value: string): IntervalLiteral | null {\n let raw = (value ?? '').trim().toLowerCase().replace(/\\s+/g, ' ')\n if (!raw) return null\n let match = raw.match(/^(-?\\d+(?:\\.\\d+)?)\\s+([a-z]+)$/)\n if (!match) return null\n let quantity = Number(match[1])\n if (!Number.isFinite(quantity)) return null\n let unit = INTERVAL_UNITS[match[2]]\n if (!unit) return null\n return {quantity, unit}\n}\n\nexport function parseIntervalUnit(value: string): TimestampUnit | null {\n return INTERVAL_UNITS[value.toLowerCase()] || null\n}\n\nfunction buildResult(year: number, month: number, day: number, hour: number, minute: number, second: number, timeframe: TemporalLiteral['timeframe'], expected: string): TemporalLiteral {\n if (expected === 'date') {\n return {literal: `${pad(year)}-${pad(month)}-${pad(day)}`, timeframe, type: scalarType('date')}\n }\n return {\n literal: `${pad(year)}-${pad(month)}-${pad(day)} ${pad(hour)}:${pad(minute)}:${pad(second)}`,\n timeframe,\n type: scalarType('timestamp'),\n }\n}\n\nfunction inRange(value: number, min: number, max: number) {\n return Number.isInteger(value) && value >= min && value <= max\n}\n\nfunction isValidDate(year: number, month: number, day: number) {\n if (!inRange(month, 1, 12)) return false\n if (!inRange(day, 1, 31)) return false\n let date = new Date(Date.UTC(year, month - 1, day))\n return date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n}\n\nfunction pad(value: number) {\n return value.toString().padStart(2, '0')\n}\n\nexport function renderTemporalArithmetic(dialect: string, leftSql: string, leftType: 'date' | 'timestamp', op: '+' | '-', intervalExpr: NonNullable<Expr['interval']>) {\n if (dialect == 'snowflake') {\n let signedQuantity = op == '+' ? intervalExpr.quantitySql : `-(${intervalExpr.quantitySql})`\n let fnName = leftType == 'date' ? 'DATEADD' : 'TIMESTAMPADD'\n return `${fnName}(${intervalExpr.unit}, ${signedQuantity}, ${leftSql})`\n }\n return `${leftSql} ${op} ${renderStandaloneInterval(dialect, intervalExpr)}`\n}\n\nexport function renderStandaloneInterval(dialect: string, intervalExpr: NonNullable<Expr['interval']>) {\n if (dialect == 'duckdb') {\n if (intervalExpr.form == 'constant') return `interval ${intervalExpr.quantitySql} ${intervalExpr.unit}`\n return `(${intervalExpr.quantitySql} * (interval 1 ${intervalExpr.unit}))`\n }\n return `interval ${intervalExpr.quantitySql} ${intervalExpr.unit}`\n}\n", "import {type SyntaxNode, type SyntaxNodeRef} from '@lezer/common'\n\nimport type {GrapheneError} from './index.d.ts'\n\nimport {\n aggregateFanoutMessage,\n normalizeExprFanout,\n extendFanoutPath,\n fanoutMessage,\n fanoutPathKey,\n isBaseFanoutPath,\n isChasmTrap,\n isPrefix,\n mergeFanoutPaths,\n mergeSensitiveFanouts,\n multiGrainMessage,\n uniqueFanoutPaths,\n} from './fanout.ts'\nimport {analyzeBareFunction, analyzeFunction} from './functions.ts'\nimport {parseMarkdown} from './markdown.ts'\nimport {extractLeadingMetadataDetails, validateMetadataEntries} from './metadata.ts'\nimport {parser} from './parser.js'\nimport {parseTemporalLiteral, parseIntervalLiteral, parseIntervalUnit, renderTemporalArithmetic, renderStandaloneInterval} from './temporal.ts'\nimport {inferTimeOrdinal} from './temporalMetadata.ts'\nimport {\n scalarType,\n type AnalysisConfig,\n type AnalysisResult,\n type AnalysisWorkspace,\n type FileInfo,\n type Query,\n type Table,\n type QueryJoin,\n type Column,\n type FieldType,\n type Expr,\n type CteTable,\n type JoinType,\n type Scope,\n type Location,\n type NavigationSymbolKind,\n type FieldMeta,\n formatType,\n isArrayType,\n isScalarType,\n parseGsqlFieldType,\n type TypeKind,\n type WorkspaceFileInput,\n} from './types.ts'\nimport {buildFrame, txt, getFile, getPosition, toRelativePath} from './util.ts'\n\n// Analyze is the heart of gsql processing. It works in 2 phases:\n// 1. walk the parse tree looking for tables, views, and extend blocks.\n// 2. starting from a query, recursively analyze every expression computing types and generating sql.\n//\n// When a query has something like `from foo select bar.baz`, we add `bar` as an implicit join, an recursively analyze `baz`\n// which itself might be an expression that traverses other joins.\n//\n// It's also possible to do a \"full\" analysis where we look at every field on every table.\n// Analyzing checks that expression are valid, that types are correct, and generates dialect-specific sql.\n//\n// NB that while the first step of collecting tables can be used between runs, analysis kinda can't since the alias for a given\n// join could change from query to query.\n\nexport function analyzeWorkspace(workspace: AnalysisWorkspace, targetPath?: string): AnalysisResult {\n return new AnalysisSession(workspace).analyze(targetPath)\n}\n\nexport interface Analyzer {\n config: AnalysisConfig\n analyzeExpr(node: SyntaxNode, scope: Scope): Expr\n diag<T>(node: SyntaxNode | SyntaxNodeRef, message: string, defaultReturn?: T): T\n checkTypes(expr: Expr, expected: TypeKind[], node: SyntaxNode): void\n}\n\nclass AnalysisSession implements Analyzer {\n config: AnalysisConfig\n files: FileInfo[]\n diagnostics: GrapheneError[] = []\n filesByPath: Record<string, FileInfo> = {}\n computedColumnStack = new Set<Column>() // Track computed columns being analyzed to detect cycles\n viewStack = new Set<Table>() // Also detect view cycles\n\n constructor(workspace: AnalysisWorkspace) {\n this.config = workspace.config\n this.files = workspace.files.map(file => this.createFile(file))\n this.filesByPath = Object.fromEntries(this.files.map(file => [file.path, file]))\n }\n\n analyze(targetPath?: string): AnalysisResult {\n this.files.forEach(file => {\n file.tree!.fileInfo = file\n this.recordSyntaxErrors(file)\n this.findTables(file)\n })\n this.files.forEach(file => this.applyExtends(file))\n\n if (targetPath) {\n let target = this.fileForPath(targetPath)\n if (!target) return {files: this.files, diagnostics: this.diagnostics}\n target.tables.forEach(table => this.analyzeTableFully(table))\n let nodes = target.tree!.topNode.getChildren('QueryStatement') || []\n target.queries = nodes.map(node => this.analyzeQuery(node)).filter((query): query is Query => !!query)\n return {files: this.files, diagnostics: this.diagnostics}\n }\n\n this.files.flatMap(file => file.tables).forEach(table => this.analyzeTableFully(table))\n this.files.forEach(file => {\n let nodes = file.tree!.topNode.getChildren('QueryStatement') || []\n file.queries = nodes.map(node => this.analyzeQuery(node)).filter((query): query is Query => !!query)\n })\n\n return {files: this.files, diagnostics: this.diagnostics}\n }\n\n private createFile(file: WorkspaceFileInput): FileInfo {\n let parsed = file.parsed || this.parseFile(file)\n let next = {\n path: file.path,\n contents: file.contents,\n tree: parsed.tree,\n tables: [],\n queries: [],\n navigation: {symbols: [], references: []},\n virtualContents: parsed.virtualContents,\n virtualToMarkdownOffset: parsed.virtualToMarkdownOffset,\n parsedDiagnostics: parsed.diagnostics,\n } as FileInfo\n next.tree!.fileInfo = next\n this.recordParsedDiagnostics(next, parsed.diagnostics || [])\n return next\n }\n\n private parseFile(file: WorkspaceFileInput) {\n let kind = file.kind || (file.path.endsWith('.md') ? 'md' : 'gsql')\n if (kind == 'md') return parseMarkdown(file)\n return {tree: parser.parse(file.contents)}\n }\n\n private fileForPath(path: string) {\n return this.filesByPath[path]\n }\n\n private locationForNode(node: SyntaxNode): Location {\n let file = getFile(node)\n return {file: file.path, from: getPosition(node.from, file), to: getPosition(node.to, file)}\n }\n\n private symbolId(kind: NavigationSymbolKind, location: Location, scopeKey = '') {\n let suffix = scopeKey ? `:${scopeKey}` : ''\n return `${kind}:${location.file}:${location.from.offset}:${location.to.offset}${suffix}`\n }\n\n private extractMetadata(node: SyntaxNode) {\n let details = extractLeadingMetadataDetails(node)\n let file = getFile(node)\n for (let diagnostic of validateMetadataEntries(details.entries)) {\n this.diagRange(file, diagnostic.from, diagnostic.to, diagnostic.message)\n }\n return details.metadata\n }\n\n private renderTableHover(table: Table) {\n let desc = table.metadata?.description ? `\\n\\n${table.metadata.description}` : ''\n return `#### ${table.name}${desc}`\n }\n\n private renderFieldHover(table: Table, field: Column) {\n let desc = field.metadata?.description ? `\\n\\n${field.metadata.description}` : ''\n return `#### ${table.name}.${field.name}${desc}`\n }\n\n private addSymbol(kind: NavigationSymbolKind, node: SyntaxNode, name: string, opts: {tableId?: string; scopeKey?: string; hover?: string} = {}) {\n let file = getFile(node)\n let location = this.locationForNode(node)\n let id = this.symbolId(kind, location, opts.scopeKey)\n file.navigation.symbols.push({id, kind, name, location, tableId: opts.tableId, hover: opts.hover})\n return {symbolId: id, location}\n }\n\n private addReference(kind: NavigationSymbolKind, node: SyntaxNode, targetId?: string) {\n if (!targetId) return\n let file = getFile(node)\n file.navigation.references.push({kind, targetId, location: this.locationForNode(node)})\n }\n\n // Creates tables without analyzing them.\n findTables(fi: FileInfo) {\n let tn = fi.tree!.topNode\n fi.tables = []\n let nodes = tn.getChildren('TableStatement').concat(tn.getChildren('ViewStatement'))\n for (let syntaxNode of nodes) {\n let refNode = syntaxNode.getChild('Ref')!\n let name = txt(refNode)\n\n let existing = this.files.find(file => {\n if (file.path.endsWith('.md') && file.path != fi.path) return\n return file.tables.find(table => table.name == name)\n })\n if (existing) this.diag(refNode, `Table \"${name}\" is already defined`)\n\n let hasNamespace = name.includes('.')\n let tablePath = !hasNamespace && this.config.defaultNamespace ? `${this.config.defaultNamespace}.${name}` : name\n let type = syntaxNode.getChild('QueryExpression') ? 'view' : ('table' as const)\n let table = {name, type, tablePath, filePath: fi.path, columns: [], joins: [], metadata: this.extractMetadata(syntaxNode), syntaxNode} as Table\n Object.assign(table, this.addSymbol('table', refNode, name, {hover: this.renderTableHover(table)}))\n\n syntaxNode.getChildren('ColumnDef').forEach(node => this.addColumn(table, node))\n syntaxNode.getChildren('JoinDef').forEach(node => this.addJoin(table, node))\n syntaxNode.getChildren('ComputedDef').forEach(node => this.addComputedColumn(table, node))\n\n fi.tables.push(table)\n }\n }\n\n // `extend` blocks add columns and joins to existing tables\n applyExtends(fi: FileInfo) {\n fi.tree!.topNode.getChildren('ExtendStatement').forEach(node => {\n let target = this.lookupTable(node.getChild('Ref')!)\n if (!target) return\n node.getChildren('JoinDef').forEach(join => this.addJoin(target, join))\n node.getChildren('ComputedDef').forEach(col => this.addComputedColumn(target, col))\n })\n }\n\n private addColumn(table: Table, node: SyntaxNode) {\n let nameNode = node.getChild('ColumnName')!\n let name = txt(nameNode)\n let parsed = parseGsqlFieldType(txt(node.getChild('DataType')))\n if (parsed.error) return this.diag(node, parsed.error)\n if (!parsed.type) return this.diag(node, `Unsupported data type: ${txt(node.getChild('DataType'))}`)\n let type = parsed.type\n let col: Column = {name, type, metadata: this.extractMetadata(node)}\n Object.assign(col, this.addSymbol('column', nameNode, name, {tableId: table.symbolId, hover: this.renderFieldHover(table, col)}))\n if (this.getField(name, table)) return this.diag(node, `Table already has a field called \"${name}\"`)\n table.columns.push(col)\n }\n\n private addJoin(table: Table, node: SyntaxNode) {\n let aliasNode = node.getChild('Alias') || node.getChild('Ref')!.getChildren('Identifier').pop()\n let alias = txt(aliasNode)\n\n let joinTypeStr = txt(node.getChild('JoinType')).replace(/\\s+/g, ' ')\n let cardinality = {'join many': 'many', 'join one': 'one'}[joinTypeStr] as 'one' | 'many'\n if (!cardinality) return this.diag(node, 'Unknown join type')\n\n let targetNode = node.getChild('Ref')!\n let targetTable = txt(targetNode)\n let onExpr = node.getChild('BinaryExpression')!\n\n let join: QueryJoin = {alias, source: 'implicit', targetTable, cardinality, onExpr, targetNode}\n if (this.getField(alias, table)) return this.diag(node, `Table already has a field called \"${alias}\"`)\n table.joins.push(join)\n }\n\n private addComputedColumn(table: Table, node: SyntaxNode) {\n let nameNode = node.getChild('Alias')!\n let name = txt(nameNode)\n let col: Column = {name, type: scalarType('string'), exprNode: node.getChild('Expression')!, metadata: this.extractMetadata(node)}\n Object.assign(col, this.addSymbol('column', nameNode, name, {tableId: table.symbolId, hover: this.renderFieldHover(table, col)}))\n if (this.getField(name, table)) return this.diag(node, `Table already has a field called \"${name}\"`)\n table.columns.push(col)\n }\n\n private getField(name: string, table: Table) {\n return table.columns.find(col => col.name == name) || table.joins.find(join => join.alias == name)\n }\n\n // Analyze a view's underlying query to determine its output columns.\n // Converts a PhysicalTable with a QueryStatement into a ViewTable with a query.\n // If analysis succeeds, populates the view's query and output columns.\n private analyzeView(table: Table) {\n if (table.type != 'view') return\n if (table.query) return\n if (this.viewStack.has(table)) {\n this.diag(table.syntaxNode?.getChild('Ref') || table.syntaxNode!, 'Cycles are not allowed between views')\n return\n }\n this.viewStack.add(table)\n\n let query = this.analyzeQuery(table.syntaxNode!.getChild('QueryExpression')!)\n this.viewStack.delete(table)\n if (!query) return\n\n let file = this.fileForPath(table.filePath)\n let viewCols = query.fields.map(field => {\n let col = {name: field.name, type: field.type, metadata: field.metadata, location: field.definitionLocation} as Column\n if (field.definitionLocation) {\n col.symbolId = this.symbolId('column', field.definitionLocation, `${table.symbolId}:${field.name}`)\n file.navigation.symbols.push({id: col.symbolId, kind: 'column', name: col.name, location: field.definitionLocation, tableId: table.symbolId, hover: this.renderFieldHover(table, col)})\n }\n return col\n })\n table.columns.push(...viewCols)\n table.query = query\n }\n\n // Analyze everything in a table - used for full project analysis (e.g., `check` command)\n analyzeTableFully(table: Table) {\n if (table.type == 'view') this.analyzeView(table)\n let file = this.fileForPath(table.filePath)\n let scope: Scope = {file, table, alias: table.name, fanoutPath: []}\n table.columns.forEach(col => {\n if (!col.exprNode) return\n let expr = this.analyzeExpr(col.exprNode, scope)\n col.type = expr.type\n col.isAgg = expr.isAgg\n this.analyzeComputedFieldExpr(col.exprNode, expr)\n })\n table.joins.forEach(join => {\n join.table = this.lookupTable(join.targetNode!)\n if (!join.table || !join.onExpr) return\n let joinTarget = {name: join.alias, table: join.table, alias: join.alias}\n this.analyzeExpr(join.onExpr, {file, table, alias: table.name, fanoutPath: [], joinTarget})\n })\n }\n\n // Expand non-aggregate columns into query fields.\n // When table is provided, expands that single table's columns.\n // When table is null, expands all root-visible query tables (base + ad-hoc joins).\n private expandColumns(table: Table | null, alias: string, query: Query, scope: Scope, namePrefix = '') {\n if (!table) {\n let baseJoin = query.joins.find(join => join.source == 'from')\n if (!baseJoin?.table) return\n this.expandColumns(baseJoin.table, baseJoin.alias, query, scope)\n for (let join of query.joins.filter(join => join.source == 'ad-hoc')) {\n if (join.table) this.expandColumns(join.table, join.alias, query, scope, join.alias)\n }\n return\n }\n\n let file = this.fileForPath(table.filePath)\n for (let col of table.columns) {\n let outName = namePrefix ? `${namePrefix}_${col.name}` : col.name\n if (col.exprNode) {\n // Determine if aggregate (without query context to avoid side-effect diagnostics), then skip measures\n if (col.isAgg == null) col.isAgg = this.analyzeExpr(col.exprNode, {file, table, alias, fanoutPath: scope.fanoutPath}).isAgg\n if (col.isAgg) continue\n let expr = this.analyzeExpr(col.exprNode, {file, query: scope.query, table, alias, otherTables: scope.otherTables, fanoutPath: scope.fanoutPath})\n if (isScalarType(expr.type, 'interval') && expr.interval?.form == 'scaled') this.diag(col.exprNode, 'Multiplied intervals are only supported inside date/time arithmetic')\n this.addQueryField(query, {\n name: outName,\n sql: expr.sql,\n type: expr.type,\n metadata: {...expr.metadata, ...col.metadata},\n fanout: expr.fanout,\n definitionLocation: col.location,\n diagNode: col.exprNode || table.syntaxNode,\n })\n } else {\n this.addQueryField(query, {\n name: outName,\n sql: `${alias}.${col.name}`,\n type: col.type,\n metadata: col.metadata,\n fanout: normalizeExprFanout({path: scope.fanoutPath}),\n definitionLocation: col.location,\n diagNode: table.syntaxNode,\n })\n }\n }\n }\n\n // Main query analysis - analyzes and returns a Query with computed SQL\n analyzeQuery(queryNode: SyntaxNode, outerCtes?: Table[]): Query | void {\n if (queryNode.name == 'QueryStatement') queryNode = queryNode.getChild('QueryExpression')!\n return this.analyzeQueryExpression(queryNode.getChild('QueryExpression') || queryNode, getFile(queryNode), outerCtes)\n }\n\n private analyzeQueryExpression(queryNode: SyntaxNode, file: FileInfo, outerCtes?: Table[]): Query | void {\n let ctes = new Map<string, CteTable>()\n let otherTables = [...(outerCtes || [])]\n let scope: Scope = {file, alias: '', fanoutPath: [], otherTables}\n\n // WITH clause - analyze each CTE. Store them on Scope, as they're accessible to later CTEs, and valid tables for the query to from/join\n let withClauses = queryNode.getChild('WithClause')?.getChildren('CteDef') || []\n for (let cteDef of withClauses) {\n let name = txt(cteDef.getChild('Alias'))\n let query = this.analyzeQuery(cteDef.getChild('QueryExpression')!, scope.otherTables)\n if (!query) return\n let columns = query.fields.map(field => ({name: field.name, type: field.type, metadata: field.metadata}) as Column)\n let cte: CteTable = {name, type: 'cte', tablePath: name, filePath: file.path, columns, joins: [], query}\n ctes.set(name, cte)\n scope.otherTables!.push(cte)\n }\n\n if (queryNode.getChildren('SetOperator').length) return this.analyzeSetQuery(queryNode, scope, ctes)\n return this.analyzeSimpleQuery(queryNode.getChild('SimpleQuery')!, queryNode, scope, ctes)\n }\n\n private analyzeSimpleQuery(simpleNode: SyntaxNode, queryNode: SyntaxNode, parentScope: Scope, ctes: Map<string, CteTable>, opts: {suppressImplicitOrderBy?: boolean} = {}): Query | void {\n let query: Query = {sql: '', fields: [], joins: [], filters: [], groupBy: [], orderBy: []}\n let scope: Scope = {...parentScope, query}\n let isAgg = false\n let fanoutExprs: {node: SyntaxNode; expr: Expr}[] = []\n\n // FROM / JOIN\n // We represent both as `joins` on the query, since they're conceptually similar for most of analysis\n let fromClause = simpleNode.getChild('FromClause')\n let sources: SyntaxNode[] = fromClause ? [fromClause, ...fromClause.getChildren('JoinClause')] : []\n for (let sourceNode of sources) {\n let isJoin = sourceNode.name == 'JoinClause'\n let unnestSource = sourceNode.getChild('UnnestSource')\n let tablePrimary = unnestSource ? undefined : sourceNode.getChild('TablePrimary')\n if (!tablePrimary && !unnestSource) return this.diag(sourceNode, `Invalid ${isJoin ? 'JOIN' : 'FROM'} source`)\n let alias = txt((unnestSource || tablePrimary)!.getChild('Alias'))\n let table: Table | undefined\n\n // This might be referring to a table by name\n let refNode = tablePrimary?.getChild('Ref') || undefined\n if (refNode) {\n table = this.lookupTable(refNode, scope)\n if (!table) return\n alias ||= txt(refNode.getChildren('Identifier').at(-1))\n }\n\n // or it could be a subquery\n if (tablePrimary?.getChild('SubqueryExpression')) {\n let subquery = this.analyzeQuery(tablePrimary.getChild('SubqueryExpression')!.getChild('QueryExpression')!, scope.otherTables)\n if (!subquery) return\n let columns = subquery.fields.map(field => ({name: field.name, type: field.type, metadata: field.metadata}) as Column)\n table = {name: 'subquery', type: 'subquery', tablePath: alias, filePath: scope.file.path, columns, joins: [], query: subquery}\n alias ||= 'subquery'\n }\n\n let joinType: JoinType | undefined = isJoin ? 'inner' : undefined\n let firstKw = txt(sourceNode.getChildren('Kw')[0]).toLowerCase()\n if (firstKw == 'left' || firstKw == 'right' || firstKw == 'full' || firstKw == 'cross') joinType = firstKw\n\n if (unnestSource) {\n if (!isJoin) return this.diag(unnestSource, 'UNNEST requires a preceding FROM table')\n if (firstKw == 'join') return this.diag(unnestSource, 'Bare JOIN UNNEST is not supported; use CROSS JOIN UNNEST')\n if (joinType != 'cross') return this.diag(unnestSource, `${joinType!.toUpperCase()} JOIN UNNEST is not supported`)\n let exprNode = unnestSource.firstChild?.nextSibling || undefined\n if (!exprNode) return this.diag(unnestSource, 'UNNEST requires an array expression')\n let expr = this.analyzeExpr(exprNode, {file: scope.file, query, alias: '', otherTables: scope.otherTables})\n if (!isArrayType(expr.type)) return this.diag(exprNode, `UNNEST requires an array expression, got ${formatType(expr.type)}`)\n let onExpr = sourceNode.getChild('Expression') || undefined\n if (onExpr) return this.diag(sourceNode, 'UNNEST join does not support an ON clause')\n if (query.joins.find(join => join.alias == alias)) return this.diag(unnestSource, `Query already has table called \"${alias}\"`)\n query.joins.push({alias, source: 'ad-hoc', joinType, fanoutPath: extendFanoutPath(undefined, alias), unnestExpr: expr})\n continue\n }\n\n // Now that we have all the bits, construct the join for it.\n if (query.joins.find(join => join.alias == alias)) return this.diag(tablePrimary!, `Query already has table called \"${alias}\"`)\n let onExpr = sourceNode.getChild('Expression') || undefined\n let qj: QueryJoin = {alias, source: isJoin ? 'ad-hoc' : 'from', table, joinType, fanoutPath: [], onExpr}\n query.joins.push(qj)\n\n // If this is a JOIN, analyze the ON expr\n // It's important we do this _after_ adding the join to the query, since analyzing the expression looks at the query\n if (joinType == 'cross' && onExpr) return this.diag(sourceNode, 'CROSS JOIN cannot have an ON clause')\n if (isJoin && !onExpr && joinType != 'cross') return this.diag(sourceNode, `${joinType!.toUpperCase()} JOIN requires an ON clause`)\n qj.onClause = onExpr && this.analyzeExpr(onExpr, {file: scope.file, query, alias: '', otherTables: scope.otherTables}).sql\n }\n\n // SELECT clause\n let selects = simpleNode.getChild('SelectClause')?.getChildren('SelectItem') || []\n let isDistinct = !!txt(simpleNode.getChild('SelectClause')).toLowerCase().startsWith('select distinct')\n\n for (let select of selects) {\n if (select.getChild('Wildcard')) {\n let pathNodes = select.getChild('Wildcard')!.getChildren('Identifier')\n if (pathNodes.length == 0) {\n this.expandColumns(null, '', query, scope)\n continue\n }\n let targetScope = this.followJoins(pathNodes, scope)\n if (!targetScope?.table) continue\n this.expandColumns(targetScope.table, targetScope.alias, query, targetScope)\n } else {\n let exprNode = select.getChild('Expression')!\n let aliasNode = select.getChild('Alias')\n let expr = this.analyzeExpr(exprNode, scope)\n if (isScalarType(expr.type, 'interval') && expr.interval?.form == 'scaled') this.diag(exprNode, 'Multiplied intervals are only supported inside date/time arithmetic')\n let {name, disambiguatedName} = aliasNode ? {name: txt(aliasNode), disambiguatedName: undefined} : this.inferName(exprNode, scope, expr)\n isAgg ||= !!expr.isAgg\n this.addQueryField(query, {\n name,\n disambiguatedName,\n sql: expr.sql,\n type: expr.type,\n metadata: expr.metadata,\n isAgg: expr.isAgg,\n fanout: expr.fanout,\n definitionLocation: this.locationForNode(aliasNode || exprNode),\n diagNode: aliasNode || exprNode,\n })\n fanoutExprs.push({node: exprNode, expr})\n }\n }\n\n // WHERE / HAVING - we allow aggregate filters in WHERE (moved to HAVING automatically)\n let whereNode = simpleNode.getChild('WhereClause')?.getChild('Expression')\n let havingNode = simpleNode.getChild('HavingClause')?.getChild('Expression')\n for (let node of [whereNode, havingNode]) {\n if (!node) continue\n for (let expr of this.unpackAnds(node, scope)) {\n query.filters.push({sql: expr.sql, isAgg: expr.isAgg})\n fanoutExprs.push({node, expr})\n }\n }\n\n // GROUP BY - adds fields if not already selected\n let groupBys = simpleNode.getChild('GroupByClause')?.getChildren('SelectItem') || []\n for (let groupBy of groupBys) {\n let exprNode = groupBy.getChild('Expression')!\n let alias = txt(groupBy.getChild('Alias'))\n\n // Positional GROUP BY (e.g. `group by 2, 1`) references the current SELECT list.\n if (exprNode.name == 'Number' && !alias) {\n let field = query.fields[Number(txt(exprNode)) - 1]\n if (!field) this.diag(groupBy, 'No field at index ' + txt(exprNode))\n query.groupBy.push(field?.name)\n } else {\n // Otherwise, we can assume this is an expression (possibly with an alias)\n // If that expression is already in the selected fields, it's just a reference.\n let expr = this.analyzeExpr(exprNode, scope)\n if (expr.isAgg) this.diag(groupBy, 'Cannot group by aggregate expressions')\n let existing = query.fields.find(field => field.sql == expr.sql)\n if (existing) query.groupBy.push(existing.name)\n\n // If it's not in there, add it to the select.\n if (!existing) {\n let field = {\n ...(groupBy.getChild('Alias') ? {name: txt(groupBy.getChild('Alias')), disambiguatedName: undefined} : this.inferName(exprNode, scope, expr)),\n sql: expr.sql,\n type: expr.type,\n metadata: expr.metadata,\n fanout: expr.fanout,\n definitionLocation: this.locationForNode(groupBy.getChild('Alias') || exprNode),\n diagNode: groupBy.getChild('Alias') || exprNode,\n }\n this.addQueryField(query, field, {prepend: true})\n query.groupBy.push(field.name)\n }\n fanoutExprs.push({node: groupBy.getChild('Expression')!, expr})\n }\n }\n\n // If there are agg fields but no groupBy, automatically group by all non-agg fields\n let nonAggFields = query.fields.filter(field => !field.isAgg)\n if (query.groupBy.length == 0 && (isDistinct || nonAggFields.length < query.fields.length)) {\n query.groupBy = nonAggFields.map(field => field.name)\n }\n\n // ORDER BY\n let {orderBy, limit} = this.analyzeOrderAndLimit(queryNode, query)\n\n // Implicit `select *` if nothing selected (only when we have a base table)\n let baseJoin = query.joins.find(join => join.source == 'from')\n if (query.fields.length == 0 && baseJoin?.table) {\n let hasAdHoc = query.joins.some(join => join.source == 'ad-hoc')\n this.expandColumns(hasAdHoc ? null : baseJoin.table, baseJoin.alias, query, scope)\n }\n\n // Default ORDER BY for aggregate queries\n if (!opts.suppressImplicitOrderBy && orderBy.length == 0 && query.groupBy.length > 0) {\n let firstAggIdx = query.fields.findIndex(field => field.isAgg)\n if (firstAggIdx >= 0) orderBy.push({idx: firstAggIdx + 1, desc: true})\n else orderBy.push({idx: 1, desc: false}) // SELECT DISTINCT\n }\n\n query.orderBy = orderBy\n query.limit = limit\n if (isAgg) {\n fanoutExprs.forEach(({node, expr}) => this.analyzeAggregateQueryExpr(node, expr))\n this.analyzeAggregateQueryFanout(fanoutExprs)\n }\n query.sql = this.buildSql(query, ctes)\n return query\n }\n\n private analyzeSetQuery(queryNode: SyntaxNode, scope: Scope, ctes: Map<string, CteTable>): Query | void {\n let branches = [\n {\n query: this.analyzeSimpleQuery(queryNode.getChild('SimpleQuery')!, queryNode.getChild('SimpleQuery')!, scope, new Map(), {suppressImplicitOrderBy: true}),\n parenthesized: false,\n },\n ...queryNode.getChildren('SetOperand').map(node => this.analyzeSetOperand(node, scope)),\n ]\n\n let first = branches[0].query\n if (!first) return\n for (let branch of branches.slice(1)) {\n if (!branch.query) return\n if (branch.query.fields.length != first.fields.length) return this.diag(queryNode, 'Set operation branches must return the same number of columns')\n }\n\n let setOps = queryNode.getChildren('SetOperator')\n let fields = first.fields.map((field, idx) => {\n let next = {...field}\n let matches = branches.slice(1).every(branch => this.sameFieldMetadata(branch.query?.fields[idx]?.metadata, field.metadata))\n if (!matches) next.metadata = this.withoutTimeGrain(next.metadata)\n return next\n })\n\n let query: Query = {\n sql: '',\n fields,\n joins: [],\n filters: [],\n groupBy: [],\n orderBy: [],\n setOp: txt(setOps[0]).toLowerCase() as Query['setOp'],\n branches: branches as {query: Query; parenthesized?: boolean}[],\n }\n\n for (let opNode of setOps.slice(1)) {\n let op = txt(opNode).toLowerCase()\n if (op != query.setOp) return this.diag(opNode, 'Mixed set operators require parentheses')\n }\n\n let {orderBy, limit} = this.analyzeOrderAndLimit(queryNode, query)\n query.orderBy = orderBy\n query.limit = limit\n query.sql = this.buildSql(query, ctes)\n return query\n }\n\n private analyzeSetOperand(node: SyntaxNode, scope: Scope) {\n let subqueryNode = node.getChild('SubqueryExpression')\n if (subqueryNode) return {query: this.analyzeQuery(subqueryNode.getChild('QueryExpression')!, scope.otherTables), parenthesized: true}\n return {\n query: this.analyzeSimpleQuery(node.getChild('SimpleQuery')!, node.getChild('SimpleQuery')!, scope, new Map(), {suppressImplicitOrderBy: true}),\n parenthesized: false,\n }\n }\n\n private analyzeOrderAndLimit(queryNode: SyntaxNode, query: Query) {\n let orderBys = queryNode.getChild('OrderByClause')?.getChildren('OrderItem') || []\n let orderBy: {idx: number; desc: boolean}[] = []\n for (let orderItem of orderBys) {\n let fieldRef = txt(orderItem.getChild('Identifier')) || txt(orderItem.getChild('Number'))\n let desc = txt(orderItem.getChild('Kw')).toLowerCase() == 'desc'\n let idx = Number(fieldRef) || query.fields.findIndex(field => field.name == fieldRef) + 1\n if (idx > 0) orderBy.push({idx, desc})\n else if (fieldRef && isNaN(Number(fieldRef))) this.diag(orderItem, `Unknown field in ORDER BY: ${fieldRef}`)\n }\n\n let limitNodes = queryNode.getChild('LimitClause')?.getChildren('Number') || []\n let limit = limitNodes[0] ? Number(txt(limitNodes[0])) : undefined\n if (limitNodes[1]) this.diag(limitNodes[1], 'OFFSET is not supported')\n return {orderBy, limit}\n }\n\n // Assemble query parts into final SQL\n // Format a table path for the current dialect\n private formatTablePath(path: string): string {\n if (this.config.dialect === 'bigquery') return `\\`${path}\\``\n if (this.config.dialect === 'snowflake') return path.toUpperCase()\n return path\n }\n\n private renderUnnestValueSql(alias: string): string {\n return this.config.dialect == 'snowflake' ? `${alias}.value` : alias\n }\n\n private renderUnnestJoinClause(join: QueryJoin): string {\n if (!join.unnestExpr || !join.joinType) return ''\n let exprSql = join.unnestExpr.sql\n if (this.config.dialect == 'bigquery') return `CROSS JOIN UNNEST(${exprSql}) AS ${join.alias}`\n if (this.config.dialect == 'clickhouse') return `ARRAY JOIN ${exprSql} AS ${join.alias}`\n if (this.config.dialect == 'snowflake') return `, TABLE(FLATTEN(INPUT => ${exprSql})) AS ${join.alias}`\n return `CROSS JOIN unnest(${exprSql}) AS ${join.alias}(${join.alias})`\n }\n\n private buildSql(query: Query, cteMap: Map<string, CteTable>): string {\n let ctes: string[] = [...cteMap.values()].map(cte => `${cte.name} as ( ${cte.query.sql} )`)\n\n if (query.setOp) {\n let branches = (query.branches || []).map(branch => {\n let sql = branch.query.sql\n return branch.parenthesized ? `( ${sql} )` : sql\n })\n let op = query.setOp.toUpperCase()\n let sql = branches.join(` ${op} `)\n if (query.orderBy.length) {\n let parts = query.orderBy.map(order => `${order.idx} ${order.desc ? 'desc' : 'asc'} NULLS LAST`)\n sql += ` ORDER BY ${parts.join(',')}`\n }\n if (query.limit) sql += ` LIMIT ${query.limit}`\n if (ctes.length) sql = `WITH ${ctes.join(', ')} ${sql}`\n return sql\n }\n\n let selectParts = query.fields.map(field => `${field.sql} as ${field.name}`)\n let baseJoin = query.joins.find(join => join.source == 'from')\n\n // No FROM clause (e.g. `select 1`)\n if (!baseJoin?.table) return `SELECT ${selectParts.join(', ')}`\n\n let renderTableRef = (table: Table): string => {\n if (table.type === 'view') {\n if (!ctes.some(cte => cte.startsWith(table.name + ' '))) ctes.push(`${table.name} as ( ${table.query.sql} )`)\n return table.name\n }\n if (table.type === 'subquery') return `( ${table.query.sql} )`\n return this.formatTablePath(table.tablePath)\n }\n\n let fromTable = renderTableRef(baseJoin.table)\n let joinClauses = query.joins\n .filter(join => join.source != 'from')\n .map(join => {\n if (join.unnestExpr) return this.renderUnnestJoinClause(join)\n if (!join.table || !join.joinType) return ''\n let tablePath = renderTableRef(join.table)\n let keyword = join.joinType.toUpperCase() + ' JOIN'\n if (join.joinType == 'cross') return `${keyword} ${tablePath} as ${join.alias}`\n return `${keyword} ${tablePath} as ${join.alias} ON ${join.onClause}`\n })\n .filter(Boolean)\n\n let whereFilters = query.filters.filter(filter => !filter.isAgg).map(filter => filter.sql)\n let havingFilters = query.filters.filter(filter => filter.isAgg).map(filter => filter.sql)\n let groupByIndices = query.groupBy.map(group => query.fields.findIndex(field => field.name == group) + 1)\n\n let sql = `SELECT ${selectParts.join(', ')} FROM ${fromTable} as ${baseJoin.alias}`\n if (joinClauses.length) sql += ' ' + joinClauses.join(' ')\n if (whereFilters.length) sql += ` WHERE ${whereFilters.join(' AND ')}`\n if (groupByIndices.length) sql += ` GROUP BY ${groupByIndices.join(',')}`\n if (havingFilters.length) sql += ` HAVING ${havingFilters.join(' AND ')}`\n if (query.orderBy.length) {\n let parts = query.orderBy.map(order => `${order.idx} ${order.desc ? 'desc' : 'asc'} NULLS LAST`)\n sql += ` ORDER BY ${parts.join(',')}`\n }\n if (query.limit) sql += ` LIMIT ${query.limit}`\n if (ctes.length) sql = `WITH ${ctes.join(', ')} ${sql}`\n return sql\n }\n\n // Analyze an expression node and return SQL + type info\n analyzeExpr(node: SyntaxNode, scope: Scope): Expr {\n if (node.type.isError) return this.diag(node, 'Invalid expression', {sql: 'NULL', type: scalarType('error')})\n\n switch (node.name) {\n case 'Number':\n return {sql: txt(node), type: scalarType('number')}\n case 'Boolean':\n return {sql: txt(node).toLowerCase(), type: scalarType('boolean')}\n case 'Null':\n return {sql: 'NULL', type: scalarType('null')}\n case 'String':\n return {sql: `'${txt(node).slice(1, -1).replace(/'/g, \"''\")}'`, type: scalarType('string')}\n case 'Param':\n return {sql: txt(node), type: scalarType('string')} // $param - type inferred later\n\n case 'Ref': {\n let pathNodes = node.getChildren('Identifier')\n let fieldNode = pathNodes.pop()!\n let fieldName = txt(fieldNode)\n\n // Check output fields first when we're at the query root (e.g. HAVING/post-agg filters).\n // Don't do this while resolving table expressions, or we can accidentally bind to sibling\n // SELECT aliases instead of the table's computed columns.\n if (scope.query && !scope.table && pathNodes.length == 0) {\n let outField = scope.query.fields.find(field => field.name == fieldName)\n if (outField) return {sql: outField.sql, type: outField.type, isAgg: outField.isAgg, fanout: outField.fanout}\n }\n\n // Follow any dot path (e.g., `users.orders` in `users.orders.amount`), then find the field\n let targetScope = this.followJoins(pathNodes, scope)\n if (!targetScope) return {sql: 'NULL', type: scalarType('error')}\n\n // Build the list of tables to search: if followJoins landed on a specific table, just that one.\n // Otherwise, search all tables either in FROM or explicitly JOINed (but not implicitly joined).\n let possibleJoins = targetScope.table\n ? [{table: targetScope.table, alias: targetScope.alias, fanoutPath: targetScope.fanoutPath}]\n : scope.query?.joins.filter(join => join.source != 'implicit' && join.table).map(join => ({table: join.table!, alias: join.alias, fanoutPath: join.fanoutPath})) || []\n let unnestMatches = !targetScope.table && pathNodes.length == 0 ? scope.query?.joins.filter(join => join.unnestExpr && join.alias == fieldName) || [] : []\n\n // Expect just one of the possibleJoins to have the named column. Otherwise, it's an error.\n let matches = possibleJoins.filter(join => join.table.columns.some(col => col.name == fieldName))\n if (matches.length + unnestMatches.length > 1) {\n return this.diag(fieldNode, `Ambiguous field \"${fieldName}\"`, {sql: 'NULL', type: scalarType('error')})\n }\n\n if (unnestMatches.length == 1) {\n let join = unnestMatches[0]\n let elementType = isArrayType(join.unnestExpr!.type) ? join.unnestExpr!.type.elementType : scalarType('error')\n return {sql: this.renderUnnestValueSql(join.alias), type: elementType, fanout: normalizeExprFanout({path: join.fanoutPath})}\n }\n\n if (matches.length == 0) {\n if (possibleJoins.some(join => join.table.joins.some(next => next.alias == fieldName))) {\n return this.diag(fieldNode, `\"${fieldName}\" is a join, not a column`, {sql: 'NULL', type: scalarType('error')})\n }\n if (pathNodes.length == 0) {\n let bareFn = analyzeBareFunction(this, node, fieldName.toLowerCase(), scope)\n if (bareFn) return bareFn\n }\n let on = possibleJoins.length == 1 ? ` on ${possibleJoins[0].table.name}` : ''\n return this.diag(fieldNode, `Unknown field \"${fieldName}\"${on}`, {sql: 'NULL', type: scalarType('error')})\n }\n\n let {table, alias} = matches[0]\n let col = table.columns.find(column => column.name == fieldName)!\n this.addReference('column', fieldNode, col.symbolId)\n\n // Simple case: this is just a regular column on a table\n if (!col.exprNode) return {sql: `${alias}.${col.name}`, type: col.type, metadata: col.metadata, fanout: normalizeExprFanout({path: matches[0].fanoutPath})}\n\n // Computed column: analyze its expression in the matched table's scope\n if (this.computedColumnStack.has(col)) return this.diag(col.exprNode, 'Cycles are not allowed between computed columns', {sql: 'NULL', type: scalarType('error')})\n this.computedColumnStack.add(col)\n let expr = this.analyzeExpr(col.exprNode, {file: this.fileForPath(table.filePath), query: scope.query, table, alias, otherTables: scope.otherTables, fanoutPath: matches[0].fanoutPath})\n this.computedColumnStack.delete(col)\n return {sql: `(${expr.sql})`, type: expr.type, metadata: {...expr.metadata, ...col.metadata}, isAgg: expr.isAgg, fanout: expr.fanout}\n }\n\n case 'FunctionCall':\n return analyzeFunction(this, node, scope)\n\n case 'WindowExpression': {\n let baseNode = node.getChild('FunctionCall') || node.getChild('Count')\n if (!baseNode) return this.diag(node, 'Window expressions require a function call', {sql: 'NULL', type: scalarType('error')})\n let isPercentile = this.isPercentileFunctionCall(baseNode)\n if (isPercentile && !this.isPercentileWindowSpecSupported(node.getChild('OverClause')!)) {\n return this.diag(node.getChild('OverClause')!, 'pXX window form currently supports PARTITION BY only', {sql: 'NULL', type: scalarType('error')})\n }\n let base = baseNode.name == 'FunctionCall' ? analyzeFunction(this, baseNode, scope, {isWindow: true}) : this.analyzeExpr(baseNode, scope)\n if (isScalarType(base.type, 'error')) return base\n if (!base.canWindow) return this.diag(baseNode, 'Only aggregate or window functions can use OVER', {sql: 'NULL', type: scalarType('error')})\n let over = this.renderOverClause(node.getChild('OverClause')!, scope)\n return {sql: `${base.sql} OVER (${over})`, type: base.type, isAgg: false}\n }\n\n case 'Parenthetical': {\n let inner = this.analyzeExpr(node.getChild('Expression')!, scope)\n return {...inner, sql: `(${inner.sql})`}\n }\n\n case 'Count': {\n let inner = node.getChild('Expression')\n if (inner) {\n let expr = this.analyzeExpr(inner, scope)\n return {\n sql: `count(distinct ${expr.sql})`,\n type: scalarType('number'),\n metadata: {defaultName: 'count'},\n isAgg: true,\n canWindow: true,\n fanout: normalizeExprFanout({sensitivePaths: mergeSensitiveFanouts(expr.fanout?.sensitivePaths), conflict: expr.fanout?.conflict}),\n }\n }\n return {\n sql: 'count(1)',\n type: scalarType('number'),\n metadata: {defaultName: 'count'},\n isAgg: true,\n canWindow: true,\n fanout: normalizeExprFanout({sensitivePaths: [extendFanoutPath(scope.fanoutPath)]}),\n }\n }\n\n case 'BinaryExpression':\n case 'OrExpression':\n case 'AndExpression':\n case 'ComparisonExpression':\n case 'AddExpression':\n case 'MultiplyExpression': {\n let left = this.analyzeExpr(node.firstChild!, scope)\n let right = this.analyzeExpr(node.lastChild!, scope)\n let op = txt(node.firstChild?.nextSibling).toLowerCase()\n\n // Type coercion for dates\n if ((isScalarType(left.type, 'date') || isScalarType(left.type, 'timestamp')) && isScalarType(right.type, 'string')) {\n right = this.coerceToTemporal(right, left.type, node.lastChild!)\n }\n if ((isScalarType(right.type, 'date') || isScalarType(right.type, 'timestamp')) && isScalarType(left.type, 'string')) {\n left = this.coerceToTemporal(left, right.type, node.firstChild!)\n }\n\n // Date arithmetic\n if (op == '+' || op == '-') {\n if (isScalarType(left.type, 'date') || isScalarType(left.type, 'timestamp') || isScalarType(left.type, 'interval') || isScalarType(right.type, 'interval')) {\n return this.analyzeDateArithmetic(op, left, right, node)\n }\n }\n\n // Type checking for operators\n if (op == '*') {\n let multiplied = this.analyzeIntervalMultiplication(left, right, node)\n if (multiplied) return multiplied\n }\n if (op == '*' || op == '/' || op == '%') {\n this.checkTypes(left, ['number'], node.firstChild!)\n this.checkTypes(right, ['number'], node.lastChild!)\n }\n if (op == 'like' || op == 'ilike') {\n this.checkTypes(left, ['string'], node.firstChild!)\n this.checkTypes(right, ['string'], node.lastChild!)\n }\n if (op == '||') {\n this.checkTypes(left, ['string'], node.firstChild!)\n this.checkTypes(right, ['string'], node.lastChild!)\n }\n\n let resultType = left.type\n if (['and', 'or', '<', '<=', '>', '>=', '=', '!=', '<>', 'like', 'ilike'].includes(op)) resultType = scalarType('boolean')\n if (op == '||') resultType = scalarType('string')\n if (op == '<>') op = '!='\n\n // ILIKE handling for BigQuery\n let sql: string\n if (op == 'ilike' && this.config.dialect == 'bigquery') {\n sql = `LOWER(${left.sql}) LIKE LOWER(${right.sql})`\n } else if (op == 'and' || op == 'or') {\n sql = `(${left.sql} ${op.toUpperCase()} ${right.sql})`\n } else if (op == 'like' || op == 'ilike') {\n sql = `${left.sql} ${op.toUpperCase()} ${right.sql}`\n } else {\n sql = `${left.sql}${op}${right.sql}`\n }\n\n return this.mergeExprAnalysis([left, right], sql, resultType, left.isAgg || right.isAgg)\n }\n\n case 'UnaryExpression': {\n let op = txt(node.firstChild).toLowerCase()\n let child = this.analyzeExpr(node.lastChild!, scope)\n if (op == 'not') return {sql: `NOT (${child.sql})`, type: scalarType('boolean'), isAgg: child.isAgg, fanout: child.fanout}\n if (op == '-') return {sql: `-(${child.sql})`, type: child.type, isAgg: child.isAgg, fanout: child.fanout}\n if (op == '+') return {sql: `(${child.sql})`, type: child.type, isAgg: child.isAgg, fanout: child.fanout}\n return this.diag(node, `Unknown unary operator: ${op}`, {sql: 'NULL', type: scalarType('error')})\n }\n\n case 'NullTestExpression': {\n let isNot = !!node.getChildren('Kw').find(next => txt(next).toLowerCase() == 'not')\n let expr = this.analyzeExpr(node.firstChild!, scope)\n return {sql: `${expr.sql} IS ${isNot ? 'NOT ' : ''}NULL`, type: scalarType('boolean'), isAgg: expr.isAgg, fanout: expr.fanout}\n }\n\n case 'CaseExpression': {\n let parts = ['CASE']\n let isAgg = false\n let fanoutExprs: Expr[] = []\n let caseValue = node.getChild('Expression')\n if (caseValue) {\n let expr = this.analyzeExpr(caseValue, scope)\n parts.push(expr.sql)\n isAgg ||= !!expr.isAgg\n fanoutExprs.push(expr)\n }\n\n let resultType: FieldType = scalarType('string')\n for (let when of node.getChildren('WhenClause')) {\n let exprs = when.getChildren('Expression')\n let whenExpr = this.analyzeExpr(exprs[0], scope)\n let thenExpr = this.analyzeExpr(exprs[1], scope)\n resultType = thenExpr.type\n isAgg ||= !!whenExpr.isAgg || !!thenExpr.isAgg\n fanoutExprs.push(whenExpr, thenExpr)\n parts.push(`WHEN (${whenExpr.sql}) THEN ${thenExpr.sql}`)\n }\n\n let elseClause = node.getChild('ElseClause')\n if (elseClause) {\n let elseExpr = this.analyzeExpr(elseClause.getChild('Expression')!, scope)\n parts.push(`ELSE ${elseExpr.sql}`)\n isAgg ||= !!elseExpr.isAgg\n fanoutExprs.push(elseExpr)\n }\n parts.push('END')\n return this.mergeExprAnalysis(fanoutExprs, parts.join(' '), resultType, isAgg || undefined)\n }\n\n case 'InExpression': {\n let not = txt(node.getChild('Kw')).toLowerCase() == 'not'\n let expr = this.analyzeExpr(node.firstChild!, scope)\n let valueList = node.getChild('InValueList')\n let subqueryNode = node.getChild('QueryExpression')\n if (subqueryNode) {\n let subquery = this.analyzeQuery(subqueryNode, scope.otherTables)\n if (!subquery) return {sql: 'NULL', type: scalarType('error')}\n if (subquery.fields.length != 1) return this.diag(subqueryNode, 'Subquery in IN must return exactly one column', {sql: 'NULL', type: scalarType('error')})\n return {sql: `${expr.sql} ${not ? 'NOT IN' : 'IN'} (${subquery.sql})`, type: scalarType('boolean'), isAgg: expr.isAgg, fanout: expr.fanout}\n }\n if (!valueList) return this.diag(node, 'IN expression must provide either values or a subquery', {sql: 'NULL', type: scalarType('error')})\n let values = valueList.getChildren('Expression').map(valueNode => {\n let value = this.analyzeExpr(valueNode, scope)\n // Coerce string literals to temporal types if needed\n if ((isScalarType(expr.type, 'date') || isScalarType(expr.type, 'timestamp')) && isScalarType(value.type, 'string')) {\n value = this.coerceToTemporal(value, expr.type, valueNode)\n }\n return value.sql\n })\n return {sql: `${expr.sql} ${not ? 'NOT IN' : 'IN'} (${values.join(',')})`, type: scalarType('boolean'), isAgg: expr.isAgg, fanout: expr.fanout}\n }\n\n case 'BetweenExpression': {\n let not = !!node\n .getChildren('Kw')\n .map(next => txt(next).toLowerCase())\n .find(next => next == 'not')\n let [exprNode, lowNode, highNode] = node.getChildren('Expression')\n let [expr, low, high] = [exprNode, lowNode, highNode].map(next => this.analyzeExpr(next, scope))\n\n if (isScalarType(expr.type, 'date') || isScalarType(expr.type, 'timestamp')) {\n low = this.coerceToTemporal(low, expr.type, lowNode)\n high = this.coerceToTemporal(high, expr.type, highNode)\n }\n\n let sql = `${expr.sql} ${not ? 'NOT BETWEEN' : 'BETWEEN'} ${low.sql} AND ${high.sql}`\n return this.mergeExprAnalysis([expr, low, high], sql, scalarType('boolean'), expr.isAgg || low.isAgg || high.isAgg)\n }\n\n case 'SubqueryExpression': {\n let subquery = this.analyzeQuery(node.getChild('QueryExpression')!, scope.otherTables)\n if (!subquery) return {sql: 'NULL', type: scalarType('error')}\n if (subquery.fields.length != 1) return this.diag(node, 'Subquery expression must return exactly one column', {sql: 'NULL', type: scalarType('error')})\n return {sql: `(${subquery.sql})`, type: subquery.fields[0].type}\n }\n\n case 'CastExpression':\n case 'TypeCastExpression': {\n let inner = node.getChild('Expression') || node.firstChild!\n let expr = this.analyzeExpr(inner, scope)\n let typeNode = node.getChild('CastType')!\n let rawType = txt(typeNode)\n let parsed = parseGsqlFieldType(rawType)\n if (parsed.error) return this.diag(typeNode, parsed.error, {sql: 'NULL', type: scalarType('error')})\n if (!parsed.type) return this.diag(typeNode, `Unsupported cast type: ${rawType.toLowerCase()}`, {sql: 'NULL', type: scalarType('error')})\n let resultType = parsed.type\n let targetType = this.renderCastType(rawType)\n return {...expr, sql: `CAST(${expr.sql} AS ${targetType})`, type: resultType, metadata: this.preserveTemporalMetadataThroughCast(expr, resultType)}\n }\n\n case 'ExtractExpression': {\n let extractInner = node.getChild('Expression')!\n let expr = this.analyzeExpr(extractInner, scope)\n this.checkTypes(expr, ['date', 'timestamp'], extractInner)\n let unit = txt(node.getChild('ExtractUnit')!)\n .replace(/^['\"]|['\"]$/g, '')\n .toLowerCase()\n return {\n sql: `EXTRACT(${unit} FROM ${expr.sql})`,\n type: scalarType('number'),\n metadata: inferTimeOrdinal(unit, this.config.dialect),\n isAgg: expr.isAgg,\n fanout: expr.fanout,\n }\n }\n\n case 'IntervalExpression': {\n let stringNode = node.getChild('String')\n if (stringNode) {\n let parsed = parseIntervalLiteral(txt(stringNode).slice(1, -1))\n if (!parsed) return this.diag(stringNode, 'Could not parse interval', {sql: 'NULL', type: scalarType('error')})\n return {\n sql: `interval ${parsed.quantity} ${parsed.unit}`,\n type: scalarType('interval'),\n interval: {quantitySql: String(parsed.quantity), unit: parsed.unit, form: 'constant'},\n }\n }\n let quantityNode = node.getChild('Number') || node.getChild('Ref')\n if (!quantityNode) return this.diag(node, 'Interval requires a quantity before the unit', {sql: 'NULL', type: scalarType('error')})\n let quantity = this.analyzeExpr(quantityNode, scope)\n this.checkTypes(quantity, ['number'], quantityNode)\n let unit = parseIntervalUnit(txt(node.getChild('IntervalUnit')!).toLowerCase())\n if (!unit) return this.diag(node, 'Invalid interval unit', {sql: 'NULL', type: scalarType('error')})\n return {\n ...quantity,\n sql: `INTERVAL ${quantity.sql} ${unit}`,\n type: scalarType('interval'),\n interval: {quantitySql: quantity.sql, unit, form: quantityNode.name == 'Number' ? 'constant' : 'dynamic'},\n }\n }\n\n case 'DateExpression':\n case 'TimestampExpression': {\n let isDate = node.name == 'DateExpression'\n let lit = txt(node.getChild('String')!).slice(1, -1)\n let parsed = parseTemporalLiteral(lit, isDate ? 'date' : 'timestamp')\n if (!parsed) return this.diag(node, `Invalid ${isDate ? 'date' : 'timestamp'}`, {sql: 'NULL', type: scalarType('error')})\n return {sql: `${isDate ? 'DATE' : 'TIMESTAMP'} '${parsed.literal}'`, type: isDate ? scalarType('date') : scalarType('timestamp')}\n }\n\n default:\n return this.diag(node, `Unsupported expression: ${node.name}`, {sql: 'NULL', type: scalarType('error')})\n }\n }\n\n private analyzeDateArithmetic(op: '+' | '-', left: Expr, right: Expr, node: SyntaxNode): Expr {\n let merged = this.mergeExprAnalysis([left, right], '', scalarType('number'), left.isAgg || right.isAgg)\n\n // date - date = interval\n if ((isScalarType(left.type, 'date') || isScalarType(left.type, 'timestamp')) && (isScalarType(right.type, 'date') || isScalarType(right.type, 'timestamp'))) {\n if (op != '-') return this.diag(node, 'Can only subtract dates', {sql: 'NULL', type: scalarType('error')})\n let unit = isScalarType(left.type, 'timestamp') ? 'SECOND' : 'DAY'\n if (this.config.dialect == 'bigquery') return {...merged, sql: `TIMESTAMP_DIFF(${left.sql}, ${right.sql}, ${unit})`, type: scalarType('number')}\n if (this.config.dialect == 'snowflake') return {...merged, sql: `TIMESTAMPDIFF(${unit}, ${right.sql}, ${left.sql})`, type: scalarType('number')}\n return {...merged, sql: `DATE_DIFF('${unit.toLowerCase()}', ${right.sql}, ${left.sql})`, type: scalarType('number')}\n }\n\n // date +/- interval\n if ((isScalarType(left.type, 'date') || isScalarType(left.type, 'timestamp')) && isScalarType(right.type, 'interval')) {\n if (!right.interval) return this.diag(node, 'Invalid interval expression', {sql: 'NULL', type: scalarType('error')})\n return {...merged, sql: renderTemporalArithmetic(this.config.dialect, left.sql, left.type, op, right.interval), type: left.type}\n }\n\n // interval + date (normalize to date + interval)\n if (isScalarType(left.type, 'interval') && (isScalarType(right.type, 'date') || isScalarType(right.type, 'timestamp'))) {\n if (op == '-') return this.diag(node, 'Cannot subtract date from interval', {sql: 'NULL', type: scalarType('error')})\n if (!left.interval) return this.diag(node, 'Invalid interval expression', {sql: 'NULL', type: scalarType('error')})\n return {...merged, sql: renderTemporalArithmetic(this.config.dialect, right.sql, right.type, '+', left.interval), type: right.type}\n }\n\n return this.diag(node, 'Invalid date arithmetic', {sql: 'NULL', type: scalarType('error')})\n }\n\n private analyzeIntervalMultiplication(left: Expr, right: Expr, node: SyntaxNode): Expr | null {\n if (isScalarType(left.type, 'number') && isScalarType(right.type, 'interval')) return this.scaleInterval(left, right, node.lastChild!)\n if (isScalarType(left.type, 'interval') && isScalarType(right.type, 'number')) return this.scaleInterval(right, left, node.firstChild!)\n return null\n }\n\n private scaleInterval(multiplier: Expr, intervalExpr: Expr, node: SyntaxNode): Expr {\n if (!intervalExpr.interval) return this.diag(node, 'Invalid interval expression', {sql: 'NULL', type: scalarType('error')})\n if (intervalExpr.interval.form != 'constant') return this.diag(node, 'Only literal intervals can be multiplied', {sql: 'NULL', type: scalarType('error')})\n let quantitySql = intervalExpr.interval.quantitySql == '1' ? multiplier.sql : `${multiplier.sql}*${intervalExpr.interval.quantitySql}`\n return {\n sql: renderStandaloneInterval(this.config.dialect, {quantitySql, unit: intervalExpr.interval.unit, form: 'scaled'}),\n type: scalarType('interval'),\n isAgg: multiplier.isAgg || intervalExpr.isAgg,\n interval: {quantitySql, unit: intervalExpr.interval.unit, form: 'scaled'},\n }\n }\n\n private coerceToTemporal(expr: Expr, targetType: FieldType, node: SyntaxNode): Expr {\n if (!isScalarType(targetType, 'date') && !isScalarType(targetType, 'timestamp')) return expr\n // Extract the string literal value (remove quotes)\n let match = expr.sql.match(/^'(.+)'$/)\n if (!match) return expr\n let parsed = parseTemporalLiteral(match[1], targetType)\n if (!parsed) {\n this.diag(node, `Cannot parse as ${targetType}: ${expr.sql}`)\n return expr\n }\n return {...expr, sql: `${targetType.toUpperCase()} '${parsed.literal}'`, type: scalarType(targetType)}\n }\n\n private preserveTemporalMetadataThroughCast(expr: Expr, resultType: FieldType): FieldMeta | undefined {\n if (!expr.metadata?.timeGrain) return undefined\n if (!isScalarType(resultType, 'date') && !isScalarType(resultType, 'timestamp')) return undefined\n return {timeGrain: expr.metadata.timeGrain, ...(expr.metadata.defaultName ? {defaultName: expr.metadata.defaultName} : {})}\n }\n\n private sameFieldMetadata(left?: FieldMeta, right?: FieldMeta) {\n if (!left && !right) return true\n if (!left || !right) return false\n return left.timeGrain == right.timeGrain && left.timeOrdinal == right.timeOrdinal\n }\n\n private withoutTimeGrain(metadata?: FieldMeta): FieldMeta | undefined {\n if (!metadata?.timeGrain && !metadata?.timeOrdinal) return metadata\n let {timeGrain: _timeGrain, timeOrdinal: _timeOrdinal, defaultName: _defaultName, ...next} = metadata\n return Object.keys(next).length ? next : undefined\n }\n\n private isPercentileFunctionCall(node: SyntaxNode): boolean {\n if (node.name != 'FunctionCall') return false\n let name = txt(node.getChild('Identifier')).toLowerCase()\n return /^p\\d+$/.test(name)\n }\n\n private isPercentileWindowSpecSupported(overClause: SyntaxNode): boolean {\n let spec = overClause.getChild('WindowSpec')\n if (!spec) return true\n if (spec.getChild('WindowOrderByClause')) return false\n if (spec.getChild('WindowFrameClause')) return false\n return true\n }\n\n private renderOverClause(overClause: SyntaxNode, scope: Scope): string {\n let spec = overClause.getChild('WindowSpec')\n if (!spec) return ''\n let parts: string[] = []\n\n let partition = spec.getChild('WindowPartitionClause')\n if (partition) {\n let exprs = partition.getChildren('Expression').map(expr => this.analyzeExpr(expr, scope).sql)\n parts.push(`PARTITION BY ${exprs.join(', ')}`)\n }\n\n let orderBy = spec.getChild('WindowOrderByClause')\n if (orderBy) {\n let items = orderBy.getChildren('WindowOrderItem').map(item => {\n let expr = this.analyzeExpr(item.getChild('Expression')!, scope).sql\n let desc = txt(item.getChild('Kw')).toLowerCase() == 'desc'\n return `${expr} ${desc ? 'DESC' : 'ASC'}`\n })\n parts.push(`ORDER BY ${items.join(', ')}`)\n }\n\n let frame = spec.getChild('WindowFrameClause')\n if (frame) parts.push(this.renderWindowFrame(frame, scope))\n return parts.join(' ')\n }\n\n private renderWindowFrame(frame: SyntaxNode, scope: Scope): string {\n let mode = txt(frame.getChildren('Kw')[0]).toUpperCase()\n let between = frame.getChild('WindowFrameBetween')\n if (between) {\n let bounds = between.getChildren('WindowFrameBound').map(bound => this.renderWindowBound(bound, scope))\n return `${mode} BETWEEN ${bounds[0]} AND ${bounds[1]}`\n }\n let start = frame.getChild('WindowFrameStart')!.getChild('WindowFrameBound')!\n return `${mode} ${this.renderWindowBound(start, scope)}`\n }\n\n private renderWindowBound(bound: SyntaxNode, scope: Scope): string {\n let kws = bound.getChildren('Kw').map(keyword => txt(keyword).toLowerCase())\n if (kws.includes('unbounded')) return `UNBOUNDED ${kws.includes('following') ? 'FOLLOWING' : 'PRECEDING'}`\n if (kws.includes('current')) return 'CURRENT ROW'\n let expr = this.analyzeExpr(bound.getChild('Expression')!, scope).sql\n return `${expr} ${kws.includes('following') ? 'FOLLOWING' : 'PRECEDING'}`\n }\n\n // Traverse a join path (like `tableA.tableB.`), returning a new scope pointing to the target table. Adds implied joins to the query as it goes\n private followJoins(pathNodes: SyntaxNode[], scope: Scope): Scope | null {\n let part = pathNodes[0]\n let name = txt(part)\n if (pathNodes.length == 0) return scope\n\n // If we're analyzing an ON clause, any path nodes must point at the source or target table\n if (scope.joinTarget) {\n let pointsAtSource = !!scope.table && name == scope.alias\n let pointsAtTarget = name == scope.joinTarget.alias || name == scope.joinTarget.name\n if (!pointsAtSource && !pointsAtTarget) return this.diag(pathNodes[0], 'Joins must point at either the source or target table', null)\n\n let table = pointsAtTarget ? scope.joinTarget.table : scope.table!\n let alias = pointsAtTarget ? scope.joinTarget.alias : scope.alias\n this.addReference('table', pathNodes[0], table.symbolId)\n return {file: this.fileForPath(table.filePath), query: scope.query, table, alias, fanoutPath: scope.fanoutPath, otherTables: scope.otherTables}\n }\n\n // If scope is at the root of the table (ie scope.table == null), then the first part of the path could point at\n // the alias of any table in the FROM or JOIN clauses of a query.\n // But it could also refer to a join _on_ one of those tables (assuming the name is unique).\n if (!scope.table) {\n // This could be a ref to an existing FROM/JOIN alias\n let existing = scope.query!.joins.find(join => join.alias == name)\n if (existing) {\n if (!existing.table) return this.diag(part, `\"${name}\" is an unnested value, not a table`, null)\n this.addReference('table', part, existing.table.symbolId)\n scope = {...scope, file: this.fileForPath(existing.table.filePath), table: existing.table, alias: existing.alias, fanoutPath: existing.fanoutPath}\n pathNodes.shift()\n } else {\n // otherwise, this might be referring to a join _on_ one of those FROM/JOIN tables\n let matches = scope.query!.joins.filter(join => join.table && join.table.joins.some(next => next.alias == name))\n if (matches.length > 1) return this.diag(part, `\"${name}\" matches multiple possible joins in this query`, null)\n if (matches.length == 0) return this.diag(part, `Could not find \"${name}\" on query`, null)\n scope = {...scope, file: this.fileForPath(matches[0].table!.filePath), table: matches[0].table!, alias: matches[0].alias, fanoutPath: matches[0].fanoutPath}\n }\n }\n\n // At this point we're guaranteed to have a scope.table, and from here it's easy. Each part of the path must be\n // the name of a join on scope.table, and we just need to walk through each one updating our scope, and adding an implicit join to the query\n for (let part of pathNodes) {\n let name = txt(part)\n if (name == scope.alias || name == scope.table!.name) continue\n\n let table = scope.table!\n let alias = scope.alias\n let next = table.joins.find(join => join.alias == name)\n if (!next) return this.diag(part, `Unknown join \"${name}\" on ${table.name}`, null)\n\n next.table = this.lookupTable(next.targetNode!)\n if (!next.table) return null\n\n // Construct a new implied join and attache it to the query\n let fromAlias = scope.query?.joins.find(join => join.source == 'from')?.alias\n let newAlias = alias == fromAlias ? name : `${alias}_${name}`\n let fanoutPath = next.cardinality == 'many' ? extendFanoutPath(scope.fanoutPath, name) : extendFanoutPath(scope.fanoutPath)\n if (scope.query && !scope.query.joins.find(join => join.alias == newAlias)) {\n let joinTarget = {name: next.alias, table: next.table, alias: newAlias}\n let onClause = this.analyzeExpr(next.onExpr!, {file: scope.file, table, alias, fanoutPath: scope.fanoutPath, joinTarget}).sql\n scope.query.joins.push({alias: newAlias, targetTable: next.targetTable, table: next.table, source: 'implicit', cardinality: next.cardinality, fanoutPath, joinType: 'left', onClause})\n }\n\n this.addReference('table', part, next.table.symbolId)\n scope = {...scope, file: this.fileForPath(next.table.filePath), table: next.table, alias: newAlias, fanoutPath}\n }\n\n return scope\n }\n\n private mergeExprAnalysis(exprs: Expr[], sql: string, type: FieldType, isAgg?: boolean): Expr {\n let rowFanout = mergeFanoutPaths(exprs.map(expr => expr.fanout?.path))\n return {\n sql,\n type,\n isAgg,\n fanout: normalizeExprFanout({\n path: isAgg ? undefined : rowFanout.path,\n sensitivePaths: mergeSensitiveFanouts(...exprs.map(expr => expr.fanout?.sensitivePaths)),\n conflict: rowFanout.conflict || exprs.some(expr => expr.fanout?.conflict),\n }),\n }\n }\n\n private analyzeComputedFieldExpr(node: SyntaxNode, expr: Expr) {\n if (expr.fanout?.conflict) this.diag(node, 'Join graph creates a chasm trap')\n if (!expr.isAgg && !isBaseFanoutPath(expr.fanout?.path)) this.diag(node, fanoutMessage(expr.fanout?.path, 'aggregate it first'))\n let paths = uniqueFanoutPaths(expr.fanout?.sensitivePaths || [])\n if (paths.length > 1) this.diag(node, multiGrainMessage(paths))\n }\n\n private analyzeAggregateQueryExpr(node: SyntaxNode, expr: Expr) {\n if (expr.fanout?.conflict) this.diag(node, 'Join graph creates a chasm trap')\n }\n\n // Aggregate-query fanout diagnostics have to look at the query as a whole: first ensure\n // any non-aggregate dimensions stay at the same grain as the aggregates, then classify the\n // aggregate grains into the more specific cases we can explain clearly (chasm trap, a base\n // aggregate fanned out by one join, an ancestor aggregate fanned out by a descendant join,\n // or the generic join-graph fanout fallback).\n private analyzeAggregateQueryFanout(exprs: {node: SyntaxNode; expr: Expr}[]) {\n let aggExprs = exprs.filter(entry => entry.expr.isAgg)\n let paths = uniqueFanoutPaths(aggExprs.flatMap(entry => entry.expr.fanout?.sensitivePaths || []))\n if (paths.length == 0) return\n\n let pathKeys = new Set(paths.map(path => fanoutPathKey(path)))\n\n // Non-aggregate dimensions are allowed only when they stay at the same grain\n // as every aggregate in the query. Otherwise, either the dimension is fanning\n // out a base-grain aggregate or it is grouping by the wrong join-many path.\n for (let entry of exprs) {\n if (entry.expr.isAgg || isBaseFanoutPath(entry.expr.fanout?.path)) continue\n\n let exprPathKey = fanoutPathKey(entry.expr.fanout?.path)\n if (pathKeys.size == 1 && pathKeys.has(exprPathKey)) continue\n\n // A join-many dimension can fan out an aggregate that otherwise lives at base grain.\n if (paths.length == 1 && isBaseFanoutPath(paths[0])) {\n for (let aggEntry of aggExprs) {\n let entryPaths = uniqueFanoutPaths(aggEntry.expr.fanout?.sensitivePaths || [])\n if (!entryPaths.some(path => isBaseFanoutPath(path))) continue\n this.diag(aggEntry.node, aggregateFanoutMessage(txt(aggEntry.node), entry.expr.fanout?.path))\n }\n continue\n }\n\n let targetPath = paths.length == 1 && isPrefix(entry.expr.fanout!.path!, paths[0]) ? paths[0] : entry.expr.fanout?.path\n this.diag(entry.node, fanoutMessage(targetPath, 'aggregate queries cannot group by it directly'))\n }\n\n if (paths.length <= 1) return\n\n let joinedPaths = paths.filter(path => !isBaseFanoutPath(path))\n\n // Sibling join-many branches produce a classic chasm trap.\n if (joinedPaths.length > 1 && isChasmTrap(joinedPaths)) {\n let message = multiGrainMessage(joinedPaths)\n for (let entry of aggExprs) {\n let entryPaths = uniqueFanoutPaths(entry.expr.fanout?.sensitivePaths || [])\n if (entryPaths.length == 0) continue\n this.diag(entry.node, message)\n }\n return\n }\n\n // One base-grain aggregate plus one joined grain means the base aggregate is fanned out.\n if (paths.length == 2 && joinedPaths.length == 1) {\n for (let entry of aggExprs) {\n let entryPaths = uniqueFanoutPaths(entry.expr.fanout?.sensitivePaths || [])\n if (!entryPaths.some(path => isBaseFanoutPath(path))) continue\n this.diag(entry.node, aggregateFanoutMessage(txt(entry.node), joinedPaths[0]))\n }\n return\n }\n\n // Ancestor/descendant join-many paths mean the shallower aggregate is fanned out by the deeper join.\n if (paths.length == 2 && joinedPaths.length == 2) {\n let [pathA, pathB] = joinedPaths\n let ancestor: typeof pathA | undefined\n let descendant: typeof pathA | undefined\n\n if (isPrefix(pathA, pathB)) {\n ancestor = pathA\n descendant = pathB\n } else if (isPrefix(pathB, pathA)) {\n ancestor = pathB\n descendant = pathA\n }\n\n if (ancestor && descendant) {\n let ancestorKey = fanoutPathKey(ancestor)\n let descendantKey = fanoutPathKey(descendant)\n for (let entry of aggExprs) {\n let entryPaths = uniqueFanoutPaths(entry.expr.fanout?.sensitivePaths || [])\n if (!entryPaths.some(path => fanoutPathKey(path) == ancestorKey) || entryPaths.some(path => fanoutPathKey(path) == descendantKey)) continue\n this.diag(entry.node, aggregateFanoutMessage(txt(entry.node), descendant))\n }\n return\n }\n }\n\n // Anything more complex falls back to the generic join-graph fanout diagnostic.\n let message = multiGrainMessage(paths)\n for (let entry of aggExprs) {\n let entryPaths = uniqueFanoutPaths(entry.expr.fanout?.sensitivePaths || [])\n if (entryPaths.length == 0) continue\n this.diag(entry.node, message)\n }\n }\n\n // Find a table by Ref node, failing if it doesn't exist\n private lookupTable(node: SyntaxNode, scope?: Scope): Table | undefined {\n let name = txt(node)\n let table: Table | undefined\n\n for (let scopeTable of scope?.otherTables || []) {\n if (scopeTable.name == name) table = scopeTable\n }\n let currentUri = getFile(node).path\n for (let file of this.files) {\n if (table) break\n if (file.path.endsWith('.gsql') || file.path == currentUri) {\n let match = file.tables.find(next => next.name == name)\n if (match) table = match\n }\n }\n if (!table) return this.diag(node, `Unknown table \"${name}\"`)\n this.analyzeView(table)\n if (table.type == 'view' && !table.query) return\n this.addReference('table', node, table.symbolId)\n return table\n }\n\n private addQueryField(query: Query, field: Query['fields'][number] & {diagNode?: SyntaxNode}, opts?: {prepend?: boolean}) {\n let conflicts = query.fields.filter(existing => existing.name == field.name)\n if (conflicts.length == 0) return this.insertQueryField(query, field, opts)\n\n if (field.disambiguatedName && conflicts.every(existing => existing.disambiguatedName)) {\n let taken = new Set(query.fields.filter(existing => existing.name != field.name).map(existing => existing.name))\n if (this.renameInferredFields(conflicts, taken, [field.disambiguatedName])) {\n field.name = field.disambiguatedName\n return this.insertQueryField(query, field, opts)\n }\n }\n\n if (field.disambiguatedName) {\n let taken = new Set(query.fields.filter(existing => existing.name != field.name).map(existing => existing.name))\n if (!taken.has(field.disambiguatedName)) {\n field.name = field.disambiguatedName\n conflicts = query.fields.filter(existing => existing.name == field.name)\n if (conflicts.length == 0) return this.insertQueryField(query, field, opts)\n }\n }\n\n if (!field.disambiguatedName && conflicts.every(existing => existing.disambiguatedName)) {\n let taken = new Set(query.fields.filter(existing => existing.name != field.name).map(existing => existing.name))\n if (this.renameInferredFields(conflicts, taken)) return this.insertQueryField(query, field, opts)\n }\n\n if (field.diagNode) this.diag(field.diagNode, `Duplicate output column name \"${field.name}\"`)\n this.insertQueryField(query, field, opts)\n }\n\n private insertQueryField(query: Query, field: Query['fields'][number], opts?: {prepend?: boolean}) {\n if (opts?.prepend) query.fields.unshift(field)\n else query.fields.push(field)\n }\n\n private renameInferredFields(fields: Query['fields'], taken: Set<string>, extraNames: string[] = []): boolean {\n let nextNames = new Set<string>()\n for (let field of fields) {\n if (!field.disambiguatedName || taken.has(field.disambiguatedName) || nextNames.has(field.disambiguatedName)) return false\n nextNames.add(field.disambiguatedName)\n }\n for (let name of extraNames) {\n if (taken.has(name) || nextNames.has(name)) return false\n nextNames.add(name)\n }\n fields.forEach(field => {\n field.name = field.disambiguatedName!\n })\n return true\n }\n\n private inferName(exprNode: SyntaxNode, scope: Scope, expr?: Expr): Pick<Query['fields'][number], 'name' | 'disambiguatedName'> {\n if (exprNode.name == 'Ref') {\n let names = exprNode.getChildren('Identifier').map(i => txt(i))\n return {name: names.at(-1)!, disambiguatedName: names.join('_')}\n }\n let name = expr?.metadata?.defaultName || `col_${scope.query?.fields.length || 0}`\n return {name, disambiguatedName: name}\n }\n\n // TODO: do we still need this?\n private unpackAnds(node: SyntaxNode, scope: Scope): Expr[] {\n if (node.name == 'BinaryExpression') {\n let op = txt(node.firstChild?.nextSibling).toLowerCase()\n if (op == 'and') return [...this.unpackAnds(node.firstChild!, scope), ...this.unpackAnds(node.lastChild!, scope)]\n }\n return [this.analyzeExpr(node, scope)]\n }\n\n private recordSyntaxErrors(fi: FileInfo) {\n fi.tree!.topNode.cursor().iterate(node => {\n if (node.type.isError) this.diag(node.node, 'Syntax error')\n })\n }\n\n private recordParsedDiagnostics(fi: FileInfo, diagnostics: {message: string; from: number; to: number}[]) {\n for (let diagnostic of diagnostics) {\n let from = this.sourcePosition(diagnostic.from, fi)\n let to = this.sourcePosition(diagnostic.to, fi)\n this.diagnostics.push({severity: 'error', message: diagnostic.message, file: toRelativePath(fi.path), from, to, frame: buildFrame(from, to)})\n }\n }\n\n private sourcePosition(offset: number, file: FileInfo) {\n let lines = file.contents.split(/\\r?\\n/)\n let acc = 0\n for (let i = 0; i < lines.length; i++) {\n let lineText = lines[i]\n let nextAcc = acc + lineText.length + 1\n if (offset < nextAcc || i === lines.length - 1) {\n let col = Math.max(0, offset - acc)\n return {offset, line: i, col, lineStart: acc, lineText}\n }\n acc = nextAcc\n }\n return {offset, line: 0, col: 0, lineText: ''}\n }\n\n diag<T>(node: SyntaxNode | SyntaxNodeRef, message: string, defaultReturn?: T): T {\n let file = getFile(node)\n this.diagRange(file, node.from, node.to, message)\n return defaultReturn as T\n }\n\n private diagRange(file: FileInfo, fromOffset: number, toOffset: number, message: string) {\n let from = getPosition(fromOffset, file)\n let to = getPosition(toOffset, file)\n this.diagnostics.push({severity: 'error', message, file: toRelativePath(file.path), from, to, frame: buildFrame(from, to)})\n }\n\n checkTypes(expr: Expr, expected: TypeKind[], node: SyntaxNode) {\n if (isScalarType(expr.type, 'error') || isScalarType(expr.type, 'null')) return\n if (expected.some(kind => (kind == 'array' ? isArrayType(expr.type) : isScalarType(expr.type, kind)))) return\n this.diag(node, `Expected ${expected.join(' or ')}, got ${formatType(expr.type)}`)\n }\n\n private renderCastType(rawType: string): string {\n if (this.config.dialect != 'clickhouse') return rawType.toUpperCase()\n\n // ClickHouse accepts the shared Graphene type names in analysis, but some CAST\n // targets require ClickHouse-specific spellings like Float64 and Array(VARCHAR).\n let normalized = rawType.trim().toLowerCase()\n if (normalized == 'string' || normalized == 'text' || normalized == 'varchar' || normalized == 'char') return 'VARCHAR'\n if (normalized == 'float' || normalized == 'float64' || normalized == 'double' || normalized == 'double precision') return 'Float64'\n if (normalized == 'float32' || normalized == 'real') return 'Float32'\n\n let arrayMatch = normalized.match(/^array\\s*<(.+)>$/s)\n if (arrayMatch) return `Array(${this.renderCastType(arrayMatch[1])})`\n return rawType.toUpperCase()\n }\n}\n", "import {glob} from 'glob'\nimport {readFile} from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type {GrapheneError} from './index.d.ts'\n\nimport {analyzeWorkspace} from './analyze.ts'\nimport {fillInParams} from './params.ts'\nimport {type AnalysisResult, type Location, type Query, type WorkspaceFileInput} from './types.ts'\nimport {getSourceOffset} from './util.ts'\n\nexport {analyzeWorkspace}\nexport type {GrapheneError} from './index.d.ts'\nexport type {AnalysisResult, AnalysisWorkspace, FileInfo, Query, Table, WorkspaceFileInput} from './types.ts'\n\nexport async function loadWorkspace(dir: string, includeMd: boolean, ignoredFiles: string[] = []): Promise<WorkspaceFileInput[]> {\n let ignore = ['node_modules/**', '**/.*/**', '**/agents.md', '**/claude.md', ...ignoredFiles]\n let paths = await glob(includeMd ? '**/*.{gsql,md}' : '**/*.gsql', {cwd: dir, ignore, follow: false, nocase: true})\n let files: WorkspaceFileInput[] = []\n\n for await (let file of paths) {\n try {\n let contents = await readFile(path.join(dir, file), 'utf-8')\n files.push({path: file, contents})\n } catch (err: any) {\n console.error('Failed to read file', file, err.message)\n }\n }\n\n return files\n}\n\nexport function getTable(analysis: AnalysisResult, name: string) {\n return analysis.files.flatMap(file => file.tables).find(table => table.name == name)\n}\n\nexport function getFile(analysis: AnalysisResult, name: string) {\n return analysis.files.find(file => file.path == name)\n}\n\nexport function getFiles(analysis: AnalysisResult) {\n return analysis.files\n}\n\nexport function getDiagnostics(analysis: AnalysisResult): GrapheneError[] {\n return analysis.diagnostics\n}\n\nexport function getHover(analysis: AnalysisResult, path: string, line: number, col: number): string {\n let symbol = getNavigationTarget(analysis, path, line, col)\n return symbol?.hover || ''\n}\n\nexport function getDefinition(analysis: AnalysisResult, path: string, line: number, col: number): Location | null {\n let symbol = getNavigationTarget(analysis, path, line, col)\n return symbol?.location || null\n}\n\nexport function getReferences(analysis: AnalysisResult, path: string, line: number, col: number, includeDeclaration = false): Location[] {\n let symbol = getNavigationTarget(analysis, path, line, col)\n if (!symbol) return []\n\n let references = analysis.files.flatMap(file => file.navigation.references.filter(ref => ref.targetId == symbol.id).map(ref => ref.location))\n if (includeDeclaration) return [symbol.location, ...references]\n return references\n}\n\nfunction getNavigationTarget(analysis: AnalysisResult, path: string, line: number, col: number) {\n let file = getFile(analysis, path)\n if (!file) return null\n\n let offset = getSourceOffset(line, col, file)\n let reference = file.navigation.references.find(ref => containsOffset(ref.location, offset))\n if (reference) {\n return analysis.files.flatMap(next => next.navigation.symbols).find(symbol => symbol.id == reference.targetId)\n }\n\n return file.navigation.symbols.find(symbol => containsOffset(symbol.location, offset)) || null\n}\n\nfunction containsOffset(location: Location, offset: number) {\n return offset >= location.from.offset && offset <= location.to.offset\n}\n\nexport function toSql(query: Query, params: Record<string, any> = {}): string {\n query = structuredClone(query)\n fillInParams(query, params)\n return query.sql\n}\n", "import type {Query} from './types.ts'\n\nimport {parseTemporalLiteral} from './temporal.ts'\n\n// Fill in parameter values in a query's SQL strings\n// Params look like $paramName in the SQL\nexport function fillInParams(query: Query, params: Record<string, any>) {\n query.sql = replaceParams(query.sql, params)\n}\n\nfunction replaceParams(sql: string, params: Record<string, any>): string {\n // Alternation: match single-quoted strings (including escaped '') first, then $params.\n // When we match a quoted string the capture group is undefined, so we return it unchanged.\n return sql.replace(/'(?:[^']|'')*'|\\$(\\w+)/g, (match, name) => {\n if (!name) return match\n let value = params[name]\n if (value === undefined) throw new Error(`Missing param $${name}`)\n if (value === null) return 'NULL'\n if (typeof value === 'string') {\n // Check if it looks like a date/timestamp\n let asDate = parseTemporalLiteral(value, 'date')\n if (asDate) return `DATE '${asDate.literal}'`\n let asTimestamp = parseTemporalLiteral(value, 'timestamp')\n if (asTimestamp) return `TIMESTAMP '${asTimestamp.literal}'`\n // Regular string\n return `'${value.replace(/'/g, \"''\")}'`\n }\n if (typeof value === 'number') return value.toString()\n if (typeof value === 'boolean') return value ? 'true' : 'false'\n if (Array.isArray(value)) {\n // For IN clauses with array params\n return value\n .map(v => {\n if (typeof v === 'string') return `'${v.replace(/'/g, \"''\")}'`\n return String(v)\n })\n .join(',')\n }\n throw new Error(`Unsupported param type for $${name}: ${typeof value}`)\n })\n}\n", "import {spawn} from 'child_process'\nimport http from 'http'\nimport fs from 'node:fs/promises'\nimport os from 'os'\nimport path from 'path'\n\nimport {config} from '../lang/config.ts'\n\nexport const AUTH_CLIENT_ID =\n process.env.AUTH_CLIENT_ID || (process.env.NODE_ENV == 'test' ? 'connected-app-test-1e207553-009e-4382-9bc1-27aceac2a7a0' : 'connected-app-live-8264d0af-df18-4021-af96-157482d17856')\n\nexport const AUTH_SCOPES = 'offline_access'\n\nexport interface Cred {\n access_token: string\n refresh_token?: string\n token_type: string\n scope?: string\n expires_in: number // oauth gives us this\n expires_at: number // we also store this, so we can see if it the token has expired\n}\n\nconst cfgDir = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), '.config')\nconst credsPath = path.join(cfgDir, 'graphene', 'credentials.json')\n\nasync function readStore(): Promise<any> {\n try {\n let txt = await fs.readFile(credsPath, 'utf8')\n return JSON.parse(txt) || {}\n } catch {\n return {}\n }\n}\n\nasync function readEntry(): Promise<Cred | null> {\n let store = await readStore()\n return store[config.root]\n}\n\nasync function updateEntry(cred: Cred) {\n let store = await readStore()\n cred.refresh_token ||= store[config.root]?.refresh_token\n cred.expires_at = Date.now() + cred.expires_in\n store[config.root] = cred\n\n await fs.mkdir(path.dirname(credsPath), {recursive: true, mode: 0o700})\n await fs.writeFile(credsPath, JSON.stringify(store, null, 2) + '\\n', {mode: 0o600})\n if (process.platform !== 'win32') {\n await fs.chmod(credsPath, 0o600).catch(() => {})\n }\n}\n\nexport function openInBrowser(url: string) {\n try {\n let plat = process.platform\n let cmd = 'xdg-open'\n if (plat == 'darwin') cmd = 'open'\n if (plat == 'win32') cmd = 'start'\n let p = spawn(cmd, [url], {stdio: 'ignore', shell: plat === 'win32'})\n p.unref()\n } catch {\n console.log(`Open this URL to authenticate:\\n${url}`)\n }\n}\n\n// PKCE login flow (Authorization Code with loopback)\nfunction base64url(buf: ArrayBuffer | Uint8Array): string {\n let b64 = Buffer.from(buf as any).toString('base64')\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n}\n\nfunction randomBytes(len = 32): Uint8Array {\n return crypto.getRandomValues(new Uint8Array(len))\n}\n\n// Temporary local server that listens for the callback url after at the end of oauth.\nasync function startLoopback() {\n let server = http.createServer()\n await new Promise<void>(r => server.listen(0, '127.0.0.1', () => r()))\n let addr = server.address()\n if (!addr || typeof addr !== 'object') throw new Error('Couldnt start oauth callback server')\n let redirectBase = `http://127.0.0.1:${addr.port}`\n\n let waitForCode = new Promise<{code: string; state: string}>(resolve => {\n server.on('request', (req, res) => {\n let url = new URL(req.url || '/', redirectBase)\n if (url.pathname !== '/callback') {\n res.statusCode = 404\n res.end('Not Found')\n return\n }\n let code = url.searchParams.get('code') || ''\n let state = url.searchParams.get('state') || ''\n res.statusCode = 200\n res.setHeader('content-type', 'text/html; charset=utf-8')\n res.end('<html><body>Login complete. You may close this window.</body></html>')\n resolve({code, state})\n })\n })\n return {url: redirectBase, waitForCode, close: () => server.close()}\n}\n\nexport async function loginPkce(opener?: (url: string) => Promise<void>) {\n let verifier = base64url(randomBytes(48))\n let data = new TextEncoder().encode(verifier)\n let digest = await crypto.subtle.digest('SHA-256', data)\n let code_challenge = base64url(digest) // pkce challenge\n\n let state = base64url(randomBytes(16))\n let loop = await startLoopback()\n let redirect_uri = `${loop.url}/callback`\n\n // Build authorize URL (merge with provided URL if present)\n let authorizeUrl = new URL(`${config.host}/authenticate`)\n authorizeUrl.search = new URLSearchParams({\n redirect_uri,\n code_challenge,\n state,\n client_id: AUTH_CLIENT_ID,\n response_type: 'code',\n code_challenge_method: 'S256',\n scope: AUTH_SCOPES,\n }).toString()\n\n if (opener) await opener(authorizeUrl.toString())\n else openInBrowser(authorizeUrl.toString())\n\n let result = await loop.waitForCode\n if (!result.code) throw new Error('No authorization code received')\n if (result.state !== state) throw new Error('State mismatch')\n\n let res = await fetch(`${config.host}/_api/oauth2/token`, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify({\n grant_type: 'authorization_code',\n code: result.code,\n redirect_uri,\n client_id: AUTH_CLIENT_ID,\n code_verifier: verifier,\n }),\n })\n if (!res.ok) throw new Error(`token exchange failed: ${res.status}`)\n let tokenResp = await res.json()\n await updateEntry(tokenResp)\n}\n\nasync function refreshAccessToken() {\n let refresh_token = (await readEntry())?.refresh_token\n let res = await fetch(new URL('/_api/oauth2/token', config.host).toString(), {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify({grant_type: 'refresh_token', refresh_token, client_id: AUTH_CLIENT_ID}),\n })\n if (!res.ok) throw new Error(`refresh failed: ${res.status}`)\n let json = await res.json()\n await updateEntry(json)\n}\n\n// Makes a request to your Graphene cloud server with credentials stored from `graphene login`\nexport async function authenticatedFetch(pathOrUrl: string, init: RequestInit = {}): Promise<Response> {\n let entry = await readEntry()\n if (!entry) throw new Error('Not logged in; run `graphene login`')\n\n // if we know the access token is no good, refresh it now\n if (!entry.access_token || entry.expires_at < Date.now()) {\n await refreshAccessToken()\n entry = await readEntry()\n }\n let token = entry?.access_token\n if (!token) throw new Error('Failed to obtain access token')\n\n // make a request with the authorization header set\n let url = new URL(pathOrUrl, config.host)\n let headers = new Headers(init.headers || {})\n headers.set('authorization', `Bearer ${token}`)\n\n let res = await fetch(url.toString(), {...init, headers})\n\n // if the request failed, try refreshing our access token\n if (res.status === 401 || res.status === 403) {\n await refreshAccessToken()\n token = (await readEntry())?.access_token\n if (token) {\n headers.set('cookie', `access_token=${token}`)\n res = await fetch(url.toString(), {...init, headers})\n }\n }\n return res\n}\n", "import {spawn, exec} from 'child_process'\nimport fs from 'fs-extra'\nimport path from 'path'\nimport {fileURLToPath} from 'url'\nimport {promisify} from 'util'\n\nimport {config} from '../lang/config.ts'\n\nconst execAsync = promisify(exec)\n\nexport async function runServeInBackground(): Promise<void> {\n let grapheneCache = getGrapheneCache(config.root)\n let logFile = path.join(grapheneCache, 'serve.log')\n await fs.ensureDir(grapheneCache)\n\n let log = fs.openSync(logFile, 'w')\n let entryPoint = process.argv[1] || fileURLToPath(import.meta.url)\n let childArgs = [...process.execArgv, entryPoint, 'serve']\n let child = spawn(process.execPath, childArgs, {\n cwd: config.root,\n detached: true,\n env: {...process.env},\n stdio: ['ignore', log, log],\n })\n\n if (!child.pid) throw new Error('Failed to start server process')\n\n await new Promise<void>((resolve, reject) => {\n let buffer = ''\n fs.watchFile(logFile, {interval: 200}, (curr, prev) => {\n if (curr.size > prev.size) {\n // File has grown, read the new data\n let stream = fs.createReadStream(logFile, {start: 0, end: curr.size - 1})\n stream.on('data', d => {\n process.stdout.write(d)\n buffer = (buffer + d.toString()).slice(-200)\n if (buffer.includes('Server running at http://localhost:')) resolve()\n })\n }\n })\n\n child.once('exit', () => {\n reject(new Error('Exited before server started'))\n })\n child.once('error', e => reject(e))\n })\n}\n\nexport function getGrapheneCache(root: string): string {\n return path.join(root, 'node_modules', '.graphene')\n}\n\nfunction sendSignal(pid: number, signal: NodeJS.Signals): boolean {\n let pids = process.platform === 'win32' ? [pid] : [pid, -pid]\n\n for (let target of pids) {\n try {\n process.kill(target, signal)\n } catch (err) {\n let code = (err as NodeJS.ErrnoException).code\n if (code === 'ESRCH' || code === 'EINVAL') continue\n return false\n }\n }\n return true\n}\n\nexport async function stopGrapheneIfRunning(): Promise<void> {\n let port = Number(process.env.GRAPHENE_PORT) || 4000\n let pid = await getPidOnPort(port)\n if (!pid) return\n\n console.log(`Stopping server (${pid})`)\n sendSignal(pid, 'SIGTERM')\n\n let end = Date.now() + 5000\n while (Date.now() < end) {\n if (!(await getPidOnPort(port))) break\n await new Promise(resolve => setTimeout(resolve, 100))\n }\n if (await getPidOnPort(port)) {\n sendSignal(pid, 'SIGKILL')\n }\n\n if (await getPidOnPort(port)) {\n console.error('Failed to stop previous Graphene server')\n }\n}\n\nexport async function isServerRunning(portOverride?: number): Promise<boolean> {\n let port = portOverride || Number(process.env.GRAPHENE_PORT) || 4000\n return !!(await getPidOnPort(port))\n}\n\nasync function getPidOnPort(port: number): Promise<number | undefined> {\n try {\n if (process.platform === 'win32') {\n let {stdout} = await execAsync(`netstat -ano | findstr :${port}`)\n let lines = stdout.trim().split('\\n')\n for (let line of lines) {\n let parts = line.trim().split(/\\s+/)\n if (parts.length < 5) continue\n let localAddress = parts[1]\n let pid = parseInt(parts[parts.length - 1], 10)\n if (localAddress.endsWith(`:${port}`)) {\n return pid\n }\n }\n } else {\n return new Promise(resolve => {\n let child = spawn('lsof', ['-i', `:${port}`, '-t', '-sTCP:LISTEN'])\n let stdout = ''\n child.stdout.on('data', d => (stdout += d.toString()))\n child.on('close', code => {\n if (code !== 0) return resolve(undefined)\n let pid = parseInt(stdout.trim(), 10)\n resolve(isNaN(pid) ? undefined : pid)\n })\n child.on('error', () => resolve(undefined))\n })\n }\n } catch (e: any) {\n console.warn('Failed to check for server:', e.message)\n return undefined\n }\n return undefined\n}\n", "export const mockFileMap: Record<string, string> = {}\n", "import chalk from 'chalk'\nimport Table from 'cli-table3'\nimport {styleText as nodeStyleText} from 'node:util'\n\nimport {type GrapheneError} from '../lang/core.ts'\n\nconst styleText = (style: string, text: string) => {\n try {\n return nodeStyleText ? nodeStyleText(style as any, text) : text\n } catch {\n return text\n }\n}\n\nexport function printDiagnostics(diags: GrapheneError[], log?: any) {\n log ||= console.log\n let parts: string[] = []\n for (let diag of diags) {\n let sev = diag.severity === 'warn' ? 'yellow' : 'red'\n let level = diag.severity === 'warn' ? 'WARN' : 'ERROR'\n let line = diag.from ? diag.from.line + 1 : undefined\n let where = diag.file ? `${diag.file}${line ? ` line ${line}` : ''}` : 'input'\n let header = `${styleText(sev, level)}: ${where}: ${diag.message}`\n parts.push(diag.frame ? `${header}\\n${diag.frame}` : header)\n }\n if (parts.length) log(parts.join('\\n\\n'))\n}\n\nexport function printTable(rows: any[]) {\n if (!rows || rows.length === 0) {\n console.log(chalk.yellow('No results returned'))\n return\n }\n\n let headers = Object.keys(rows[0])\n let table = new Table({head: headers.map(h => chalk.blue(h))})\n let MAX_DISPLAY_ROWS = 200\n let displayRows = rows.slice(0, MAX_DISPLAY_ROWS)\n displayRows.forEach(row => table.push(headers.map(h => row[h]?.toString() || '')))\n console.log(table.toString())\n if (rows.length > MAX_DISPLAY_ROWS) {\n console.log(chalk.yellow(`Displayed first ${MAX_DISPLAY_ROWS} rows (of ${rows.length} total).`))\n }\n}\n", "import ci from 'ci-info'\nimport {createHash} from 'node:crypto'\nimport {access, constants, readFile} from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type {Config} from '../../lang/config.ts'\nimport type {WorkspaceFileInput} from '../../lang/core.ts'\nimport type {TelemetryBatch, TelemetryCommand, TelemetryEvent, TelemetryEventName, TelemetryPayloads} from './types.ts'\n\nimport {TelemetryStorage} from './storage.ts'\nexport type {TelemetryCommand, TelemetryEventName, TelemetryPayloads} from './types.ts'\n\nconst DEFAULT_TELEMETRY_ENDPOINT = 'https://app.graphenedata.com/cli-telemetry'\nconst SAFE_FLAG_NAMES: Partial<Record<TelemetryCommand, Record<string, string[]>>> = {\n run: {chart: ['--chart', '-c'], input: ['--input'], query: ['--query', '-q']},\n serve: {bg: ['--bg']},\n}\n\nexport class CliTelemetry {\n private storage: TelemetryStorage\n private installId = ''\n private projectHash?: string\n private enabled = true\n private workspaceScanSent = false\n private cfg: Config\n private cliVersion: string\n private endpoint: string\n\n constructor(cfg: Config, cliVersion: string, endpoint = process.env.GRAPHENE_TELEMETRY_ENDPOINT || DEFAULT_TELEMETRY_ENDPOINT) {\n this.cfg = cfg\n this.cliVersion = cliVersion\n this.endpoint = endpoint\n this.storage = new TelemetryStorage({projectRoot: cfg.root})\n }\n\n async init(cwd = process.cwd()) {\n this.enabled = isTelemetryEnabled(this.cfg, this.endpoint)\n if (!this.enabled) return\n\n await this.storage.init()\n this.installId = this.storage.installId\n this.projectHash = await getProjectHash(cwd)\n }\n\n event<K extends TelemetryEventName>(event: K, ...args: TelemetryPayloads[K] extends undefined ? [] : [payload: TelemetryPayloads[K]]) {\n if (!this.enabled) return\n if (event == 'workspace_scanned') {\n if (this.workspaceScanSent) return\n this.workspaceScanSent = true\n }\n\n let payload = args[0] || {}\n this.send({...this.commonFields(), event, ...payload} as TelemetryEvent)\n }\n\n async markSuccessfulInvocation() {\n if (!this.enabled) return {shouldSendInstallSeen: false, fromVersion: undefined}\n return await this.storage.markSuccessfulInvocation(this.cliVersion)\n }\n\n private commonFields() {\n return {\n install_id: this.installId,\n project_hash: this.projectHash,\n cli_version: this.cliVersion,\n timestamp: new Date().toISOString(),\n ci: ci.isCI,\n node_platform: process.platform,\n node_version: process.version,\n }\n }\n\n private send(event: TelemetryEvent) {\n let batch: TelemetryBatch = {events: [event]}\n let controller = new AbortController()\n let timeout = setTimeout(() => controller.abort(), 500)\n timeout.unref?.()\n\n void fetch(this.endpoint, {\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n body: JSON.stringify(batch),\n signal: controller.signal,\n })\n .catch(() => {})\n .finally(() => clearTimeout(timeout))\n }\n}\n\nexport function isTelemetryEnabled(config: Config, endpoint: string) {\n if (!endpoint) return false\n if (process.env.GRAPHENE_TELEMETRY_DISABLED == '1') return false\n if (config.telemetry === false) return false\n return true\n}\n\nexport function getPresentFlags(command: TelemetryCommand, argv: string[]) {\n let knownFlags = SAFE_FLAG_NAMES[command]\n if (!knownFlags) return []\n\n let present = Object.entries(knownFlags)\n .filter(([, aliases]) => aliases.some(alias => argv.includes(alias)))\n .map(([name]) => name)\n\n return present.sort()\n}\n\nexport function getWorkspaceScanCounts(files: Pick<WorkspaceFileInput, 'path'>[]) {\n return {\n gsql_file_count: files.filter(file => file.path.endsWith('.gsql')).length,\n md_file_count: files.filter(file => file.path.endsWith('.md')).length,\n }\n}\n\nexport async function getProjectHash(startDir: string) {\n let packageJsonPath = await findNearestPackageJson(startDir)\n if (!packageJsonPath) return undefined\n\n try {\n let raw = await readFile(packageJsonPath, 'utf-8')\n let pkg = JSON.parse(raw)\n if (typeof pkg.name != 'string') return undefined\n let normalized = pkg.name.trim().toLowerCase()\n if (!normalized) return undefined\n return createHash('sha256').update(`graphene:${normalized}`).digest('hex')\n } catch {\n return undefined\n }\n}\n\nasync function findNearestPackageJson(startDir: string) {\n let current = path.resolve(startDir)\n while (true) {\n let candidate = path.join(current, 'package.json')\n if (await pathExists(candidate)) return candidate\n\n let parent = path.dirname(current)\n if (parent == current) return null\n current = parent\n }\n}\n\nasync function pathExists(filePath: string) {\n try {\n await access(filePath, constants.F_OK)\n return true\n } catch {\n return false\n }\n}\n", "import {randomUUID} from 'node:crypto'\nimport * as fs from 'node:fs/promises'\nimport path from 'node:path'\n\nimport type {TelemetryState} from './types.ts'\n\ninterface TelemetryStorageOptions {\n projectRoot?: string\n}\n\nexport class TelemetryStorage {\n private state = defaultState()\n private options: TelemetryStorageOptions\n private nodeModulesPath?: string\n\n constructor(options: TelemetryStorageOptions = {}) {\n this.options = options\n }\n\n async init() {\n this.nodeModulesPath = await getNodeModulesPath(this.options)\n let filePath = this.telemetryFilePath()\n\n try {\n if (filePath) this.state = normalizeState(JSON.parse(await fs.readFile(filePath, 'utf-8')), this.state)\n } catch {\n // Telemetry storage is best-effort; corrupt or unreadable state should not affect commands.\n }\n }\n\n read(): TelemetryState {\n return this.state\n }\n\n get installId() {\n return this.state.installId\n }\n\n async markSuccessfulInvocation(cliVersion: string) {\n let state = this.read()\n let hasSeenVersion = state.installSeenVersions.includes(cliVersion)\n let shouldSendInstallSeen = !state.lastSeenVersion && state.installSeenVersions.length == 0\n let fromVersion = !hasSeenVersion && state.lastSeenVersion && state.lastSeenVersion != cliVersion ? state.lastSeenVersion : undefined\n\n let nextState = {\n ...state,\n lastSeenVersion: cliVersion,\n installSeenVersions: [...new Set([...state.installSeenVersions, cliVersion])],\n }\n if (!(await this.write(nextState))) return {shouldSendInstallSeen: false, fromVersion: undefined}\n\n return {shouldSendInstallSeen, fromVersion}\n }\n\n private async write(state: TelemetryState) {\n let filePath = this.telemetryFilePath()\n if (!filePath) return false\n\n let tmpPath = `${filePath}.tmp-${randomUUID()}`\n try {\n // Do not create node_modules solely for telemetry; only use the project cache if it already exists.\n if (this.nodeModulesPath && !(await fs.stat(this.nodeModulesPath)).isDirectory()) return false\n await fs.mkdir(path.dirname(filePath), {recursive: true})\n await fs.writeFile(tmpPath, JSON.stringify(state, null, 2) + '\\n')\n await fs.rename(tmpPath, filePath)\n this.state = state\n return true\n } catch {\n try {\n await fs.unlink(tmpPath)\n } catch {\n // Nothing to clean up if the temp file was never created.\n }\n return false\n }\n }\n\n private telemetryFilePath() {\n if (this.nodeModulesPath) return path.join(this.nodeModulesPath, '.graphene', 'telemetry.json')\n }\n}\n\nfunction defaultState(): TelemetryState {\n return {installId: randomUUID(), installSeenVersions: []}\n}\n\nasync function getNodeModulesPath(options: TelemetryStorageOptions) {\n if (!options.projectRoot) return\n\n let nodeModules = path.join(options.projectRoot, 'node_modules')\n try {\n if (!(await fs.stat(nodeModules)).isDirectory()) return\n } catch {\n return\n }\n\n return nodeModules\n}\n\nfunction normalizeState(state: Partial<TelemetryState>, fallback: TelemetryState): TelemetryState {\n return {\n installId: typeof state.installId == 'string' && state.installId ? state.installId : fallback.installId,\n installSeenVersions: Array.isArray(state.installSeenVersions) ? state.installSeenVersions.filter(version => typeof version == 'string') : fallback.installSeenVersions,\n ...(typeof state.lastSeenVersion == 'string' ? {lastSeenVersion: state.lastSeenVersion} : {}),\n }\n}\n", "import {readFileSync} from 'fs'\n\nimport {config} from '../../lang/config.ts'\nimport {authenticatedFetch} from '../auth.ts'\nimport {type QueryResult, type QueryConnection, type QueryParams} from './types.ts'\n\n// Reads credentials from environment variables and passes them to the connection constructors.\n// The connection classes themselves have no env-reading logic \u2014 this keeps the cloud server\n// from accidentally picking up local env vars instead of database-stored credentials.\nexport async function getConnection(): Promise<QueryConnection> {\n if (config.dialect === 'bigquery') {\n let mod = await importConnection(() => import('./bigQuery.ts'), '@google-cloud/bigquery', 'BigQuery')\n let options: any = {}\n if (process.env.GOOGLE_CREDENTIALS_CONTENT) {\n // the actual json as an env var\n let parsed = JSON.parse(process.env.GOOGLE_CREDENTIALS_CONTENT)\n options = {projectId: parsed.project_id, credentials: parsed}\n } else if (process.env.GOOGLE_APPLICATION_CREDENTIALS) {\n // env var is the path of a json cred file\n let parsed = JSON.parse(readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS, {encoding: 'utf-8'}))\n options = {projectId: parsed.project_id}\n }\n return new mod.BigQueryConnection(options)\n } else if (config.dialect === 'duckdb') {\n let mod = await importConnection(() => import('./duckdb.ts'), '@duckdb/node-api', 'DuckDB')\n return new mod.DuckDBConnection({})\n } else if (config.dialect === 'clickhouse') {\n let mod = await importConnection(() => import('./clickhouse.ts'), '@clickhouse/client', 'ClickHouse')\n let url = config.clickhouse?.url || process.env.CLICKHOUSE_URL\n let username = config.clickhouse?.username || process.env.CLICKHOUSE_USERNAME\n let password = process.env.CLICKHOUSE_PASSWORD\n if (!url || !username || !password) throw new Error('ClickHouse requires url and username in config or env, plus CLICKHOUSE_PASSWORD in env')\n return new mod.ClickHouseConnection({\n url,\n username,\n password,\n database: config.clickhouse?.database || config.defaultNamespace || 'default',\n requestTimeout: config.clickhouse?.requestTimeout,\n })\n } else if (config.dialect === 'snowflake') {\n let mod = await importConnection(() => import('./snowflake.ts'), 'snowflake-sdk', 'Snowflake')\n return new mod.SnowflakeConnection({\n privateKeyPath: process.env.SNOWFLAKE_PRI_KEY_PATH,\n privateKey: process.env.SNOWFLAKE_PRI_KEY,\n privateKeyPass: process.env.SNOWFLAKE_PRI_PASSPHRASE,\n logLevel: process.env.SNOWFLAKE_LOG_LEVEL,\n })\n } else {\n throw new Error(`Unsupported dialect: ${config.dialect}`)\n }\n}\n\n// Import connection, with a nice error message about what to do if a peer dep is missing.\nasync function importConnection<T>(load: () => Promise<T>, packageName: string, warehouseLabel: string): Promise<T> {\n try {\n return await load()\n } catch (err: any) {\n let depMissing = err.code == 'ERR_MODULE_NOT_FOUND' || (err.message || '').includes(packageName)\n if (depMissing) {\n throw new Error(`${warehouseLabel} support requires installing ${packageName}.\\nAdd it to your project dependencies, for example:\\nnpm install ${packageName}`, {cause: err})\n } else {\n throw err\n }\n }\n}\n\nexport async function runQuery(sql: string, params?: QueryParams): Promise<QueryResult> {\n if (config.host) {\n let resp = await authenticatedFetch('/_api/query', {\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n body: JSON.stringify({sql, params}),\n })\n return await resp.json()\n }\n\n let conn = await getConnection()\n try {\n return await conn.runQuery(sql, params)\n } finally {\n await conn.close()\n }\n}\n", "import fs from 'fs-extra'\nimport {type IncomingMessage, type ServerResponse} from 'http'\nimport {readFileSync} from 'node:fs'\nimport {styleText} from 'node:util'\nimport path from 'path'\nimport {type PluginOption, type ViteDevServer} from 'vite'\nimport {WebSocketServer, type WebSocket} from 'ws'\n\nimport type {GrapheneError} from '../lang/index.d.ts'\n\nimport {config} from '../lang/config.ts'\nimport {analyzeWorkspace, getFile, loadWorkspace, toSql} from '../lang/core.ts'\nimport {type AnalysisResult, type WorkspaceFileInput} from '../lang/types.ts'\nimport {pollFor} from '../lang/util.ts'\nimport {openInBrowser} from './auth.ts'\nimport {getGrapheneCache, isServerRunning, runServeInBackground} from './background.ts'\nimport {runQuery} from './connections/index.ts'\nimport {mockFileMap} from './mockFiles.ts'\nimport {normalizeFile} from './normalizeFile.ts'\nimport {printDiagnostics, printTable} from './printer.ts'\nimport {getWorkspaceScanCounts, type CliTelemetry} from './telemetry/index.ts'\n\nexport interface RunMdFileOptions {\n mdArg: string\n chart?: string\n inputs?: RunInputs\n log?: (...args: any[]) => void\n telemetry?: CliTelemetry\n}\n\ntype RunInputs = Record<string, string | string[]>\n\nlet browserConnections: {url: string; socket: WebSocket}[] = []\nlet pendingRequests: Record<string, {response: ServerResponse<IncomingMessage>}> = {}\n\nexport async function runMdFile(options: RunMdFileOptions): Promise<boolean> {\n let log = options.log || console.log\n let mdFile = normalizeFile(options.mdArg)\n if (!mdFile) {\n log(`Couldn't find ${options.mdArg}`)\n return false\n }\n\n let files = await loadWorkspace(config.root, false, config.ignoredFiles)\n options.telemetry?.event('workspace_scanned', {command: 'run', ...getWorkspaceScanCounts(files)})\n let mdContents: string\n if (process.env.NODE_ENV == 'test' && mockFileMap[mdFile]) {\n mdContents = mockFileMap[mdFile]\n } else {\n mdContents = readFileSync(path.resolve(config.root, mdFile), 'utf-8')\n }\n\n let result = analyzeWorkspace({config, files: files.filter(file => file.path != mdFile).concat({path: mdFile, contents: mdContents, kind: 'md'})}, mdFile)\n if (result.diagnostics.length > 0) {\n printDiagnostics(result.diagnostics, log)\n return false\n }\n\n let resp = await sendSocketRequest({mdFile, action: 'check', chart: options.chart, inputs: options.inputs, log})\n if (!resp) return false\n\n let errors = Array.from(resp.errors || []) as GrapheneError[]\n let chartNotFound = !!options.chart && !resp.screenshot\n if (chartNotFound) log(`Could not find chart \"${options.chart}\" on ${mdFile}`)\n\n if (errors.length) {\n log(styleText('red', 'Runtime errors') + ` in ${mdFile}:`)\n } else if (!chartNotFound) {\n log('No errors found \uD83D\uDC8E')\n }\n\n errors.forEach((e: GrapheneError) => {\n if (e.file || e.frame) printDiagnostics([e], log)\n else if (e.componentId) log(`${e.componentId}: ${e.message}`)\n else log(e.message)\n })\n\n if (resp?.stillLoading) {\n log('Warning: Queries were still loading when the screenshot was taken')\n }\n\n if (resp?.screenshot) {\n let filename = `${new Date().toISOString().replace(/[:.]/g, '-')}.png`\n let screenshotDir = path.join(getGrapheneCache(config.root), 'screenshots')\n let screenshotPath = path.join(screenshotDir, filename)\n let base64Data = resp.screenshot.replace(/^data:image\\/png;base64,/, '')\n await fs.ensureDir(screenshotDir)\n await fs.writeFile(screenshotPath, base64Data, 'base64')\n log('Screenshot saved to', screenshotPath)\n }\n\n return errors.length == 0 && !chartNotFound\n}\n\nexport async function listMdFileQueries(mdArg: string, telemetry?: CliTelemetry, log: (...args: any[]) => void = console.log): Promise<boolean> {\n let mdFile = normalizeFile(mdArg)\n if (!mdFile) {\n log(`Couldn't find ${mdArg}`)\n return false\n }\n\n let files = await loadWorkspace(config.root, false, config.ignoredFiles)\n telemetry?.event('workspace_scanned', {command: 'list', ...getWorkspaceScanCounts(files)})\n let mdContents = process.env.NODE_ENV == 'test' && mockFileMap[mdFile] ? mockFileMap[mdFile] : readFileSync(path.resolve(config.root, mdFile), 'utf-8')\n\n let result = analyzeWorkspace({config, files: files.filter(file => file.path != mdFile).concat({path: mdFile, contents: mdContents, kind: 'md'})}, mdFile)\n if (result.diagnostics.length > 0) {\n printDiagnostics(result.diagnostics, log)\n return false\n }\n\n let resp = await sendSocketRequest({mdFile, action: 'list', log})\n if (!resp) return false\n\n let componentIds = (resp.componentIds || []) as string[]\n if (!componentIds.length) log('No chart queries found')\n else componentIds.forEach(componentId => log(componentId))\n return true\n}\n\nexport async function runNamedQueryFromMd(mdAbsolutePath: string, queryName: string, options: {inputs?: RunInputs; telemetry?: CliTelemetry} = {}): Promise<boolean> {\n let files = await loadWorkspace(process.cwd(), false, config.ignoredFiles)\n options.telemetry?.event('workspace_scanned', {command: 'run', ...getWorkspaceScanCounts(files)})\n let mdRelativePath = path.relative(process.cwd(), mdAbsolutePath)\n let mdContents = await fs.promises.readFile(mdAbsolutePath, 'utf-8')\n\n let result = analyzeWorkspace({config, files: files.filter(file => file.path != mdRelativePath).concat({path: mdRelativePath, contents: mdContents, kind: 'md'})}, mdRelativePath)\n if (result.diagnostics.length > 0) {\n printDiagnostics(result.diagnostics)\n return false\n }\n\n let runQueryFence = [mdContents, '', '```sql', `from ${queryName} select *`, '```'].join('\\n')\n let queryFiles = toWorkspaceFiles(result)\n let queryResult = analyzeWorkspace({config, files: queryFiles.filter(file => file.path != 'input.md').concat({path: 'input.md', contents: runQueryFence, kind: 'md'})}, 'input.md')\n if (queryResult.diagnostics.length > 0) {\n printDiagnostics(queryResult.diagnostics)\n return false\n }\n\n let input = getFile(queryResult, 'input.md')\n if (!input?.queries.length) return false\n let sql: string\n try {\n sql = toSql(input.queries[input.queries.length - 1], options.inputs || {})\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err))\n return false\n }\n let res = await runQuery(sql)\n printTable(res.rows)\n return true\n}\n\nasync function sendSocketRequest({mdFile, action, chart, inputs, log}: {mdFile: string; action: 'check' | 'list'; chart?: string; inputs?: RunInputs; log: (...args: any[]) => void}) {\n let pageUrl = '/' + mdFile.replace(/\\.md$/, '').replace(/^\\//, '').replace(/\\\\/g, '/')\n if (pageUrl === '/index') pageUrl = '/'\n pageUrl = appendInputsToUrl(pageUrl, inputs)\n\n if (process.env.NODE_ENV !== 'test' && !(await isServerRunning())) {\n log('Starting Graphene server...')\n await runServeInBackground()\n }\n\n let host = `http://localhost:${config.port}`\n let resp = await fetchSocketRequest({host, pageUrl, action, chart})\n\n if (resp.error == 'no_server') {\n log('Failed to start Graphene server')\n return null\n }\n\n if (resp.error == 'no_tab' && process.env.NODE_ENV !== 'test') {\n log(`Opening page ${host}${pageUrl}`)\n openInBrowser(host + pageUrl)\n await new Promise(resolve => setTimeout(resolve, 500))\n resp = await fetchSocketRequest({host, pageUrl, action, chart})\n }\n\n if (resp.error == 'no_tab') {\n log('Failed to open a new tab')\n return null\n }\n\n if (resp.error) {\n log(`Failed to ${action == 'check' ? 'run check' : 'list queries'}: ${resp.error}`)\n return null\n }\n\n return resp\n}\n\nfunction appendInputsToUrl(pageUrl: string, inputs: RunInputs = {}) {\n let search = new URLSearchParams()\n Object.entries(inputs).forEach(([name, value]) => {\n if (Array.isArray(value)) value.forEach(item => search.append(name, item))\n else search.append(name, value)\n })\n let rendered = search.toString()\n if (!rendered) return pageUrl\n return `${pageUrl}?${rendered}`\n}\n\nasync function fetchSocketRequest({host, pageUrl, action, chart}: {host: string; pageUrl: string; action: 'check' | 'list'; chart?: string}) {\n let abort = new AbortController()\n let timeout = setTimeout(() => abort.abort(), 30_000)\n let browserHost = host.replace('127.0.0.1', 'localhost')\n try {\n let response = await fetch(`${host}/_api/check`, {\n method: 'POST',\n headers: {'Content-Type': 'application/json'},\n body: JSON.stringify({pageUrl: browserHost + pageUrl, action, chart}),\n signal: abort.signal,\n })\n clearTimeout(timeout)\n\n let body = response.headers.get('content-type') == 'application/json' ? await response.json() : {error: await response.text()}\n\n if (!response.ok) {\n if (body.error) return {error: body.error}\n console.error(`Unexpected response: ${JSON.stringify(body)}`)\n return {error: 'Unexpected response from Graphene server'}\n }\n\n return body\n } catch (err: any) {\n clearTimeout(timeout)\n if (err.name === 'AbortError') return {error: 'timeout'}\n return {error: 'no_server'}\n }\n}\n\nexport async function proxyRunRequest(req: IncomingMessage, res: ServerResponse<IncomingMessage>): Promise<void> {\n let chunks = [] as any[]\n for await (let chunk of req) chunks.push(chunk)\n let {pageUrl, action, chart} = JSON.parse(Buffer.concat(chunks).toString())\n let id = Math.random().toString(36).slice(2)\n res.setHeader('Content-Type', 'application/json')\n\n let normalizedPageUrl = pageUrl.replace(/\\/$/, '')\n let conn = await pollFor(() => browserConnections.find(conn => conn.url === normalizedPageUrl), 5000, 100)\n if (!conn) {\n res.statusCode = 400\n res.end(JSON.stringify({error: 'no_tab'}))\n return\n }\n\n conn.socket.send(JSON.stringify({action, chart, requestId: id}))\n pendingRequests[id] = {response: res}\n}\n\nfunction toWorkspaceFiles(analysis: AnalysisResult): WorkspaceFileInput[] {\n return analysis.files.map(file => ({\n path: file.path,\n contents: file.contents,\n kind: file.path.endsWith('.md') ? 'md' : 'gsql',\n parsed: {tree: file.tree!, virtualContents: file.virtualContents, virtualToMarkdownOffset: file.virtualToMarkdownOffset},\n }))\n}\n\nexport function runVitePlugin(): PluginOption {\n return {\n name: 'graphene-check-plugin',\n configureServer(server: ViteDevServer) {\n let wss = new WebSocketServer({noServer: true})\n\n server.httpServer?.on('upgrade', (req, socket, head) => {\n if (!req.url || (!req.url.includes('/_api/ws') && !req.url.includes('graphene-ws'))) return\n wss.handleUpgrade(req, socket, head, ws => wss.emit('connection', ws, req))\n })\n\n wss.on('connection', socket => {\n socket.on('message', data => {\n let message = JSON.parse(data.toString())\n if (message.type === 'register') {\n let normalizedUrl = message.url.replace(/\\/$/, '')\n browserConnections.push({url: normalizedUrl, socket})\n }\n if (message.type === 'checkResponse') {\n pendingRequests[message.requestId].response.end(JSON.stringify(message))\n delete pendingRequests[message.requestId]\n }\n })\n socket.on('close', () => {\n browserConnections = browserConnections.filter(conn => conn.socket !== socket)\n })\n })\n\n server.httpServer?.on('close', () => wss.close())\n\n server.middlewares.use(async (req, res, next) => {\n let [pathName] = (req.url || '').split('?')\n if (pathName === '/_api/check') await proxyRunRequest(req, res)\n else next()\n })\n },\n }\n}\n", "import fs from 'fs-extra'\nimport path from 'path'\n\nimport {config} from '../lang/config.ts'\nimport {mockFileMap} from './mockFiles.ts'\n\nexport function normalizeFile(file: string): string | null {\n let clean = file.trim()\n if (!clean) return null\n\n if (process.env.NODE_ENV == 'test' && mockFileMap[clean]) return clean\n\n let absolute = [path.resolve(process.cwd(), clean), path.resolve(config.root, clean)].find(p => fs.existsSync(p)) || null\n\n if (!absolute) return null\n return path.relative(config.root, absolute)\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["inner", "path", "offset", "offset", "path", "from", "interval", "end", "trim", "trim", "trim", "args", "inner", "end", "end", "full", "offset", "between", "skipWhitespace", "offset", "from", "cursor", "date", "table", "path", "desc", "join", "onExpr", "select", "limit", "sql", "order", "group", "col", "on", "over", "inner", "left", "right", "when", "not", "partition", "between", "part", "name", "message", "from", "offset", "getFile", "path", "path", "txt", "spawn", "fs", "path", "path", "fs", "spawn", "end", "where", "rows", "table", "row", "readFile", "path", "fs", "path", "config", "readFile", "current", "path", "fs", "readFileSync", "styleText", "path", "fs", "path", "path", "fs", "readFileSync", "path", "styleText", "fs", "getFile", "conn"]
7
+ }