@dbsp/nql 1.0.0
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.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/index.d.ts +1055 -0
- package/dist/index.js +5044 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/types.ts","../src/compiler/column-validator.ts","../src/compiler/expression-utils.ts","../src/compiler/include-builder.ts","../src/compiler/compile-query.ts","../src/compiler/compile-cte.ts","../src/compiler/date-range-patterns.ts","../src/compiler/compile-expression.ts","../src/compiler/compile-mutation.ts","../src/compiler/compile-select.ts","../src/compiler/types.ts","../src/compiler/index.ts","../src/lexer/tokens.ts","../src/parser/grammar.ts","../src/semantic/helpers.ts","../src/semantic/visit-cte.ts","../src/semantic/visit-expression.ts","../src/semantic/visit-function.ts","../src/semantic/visit-literal.ts","../src/semantic/visit-mutation.ts","../src/semantic/visit-query.ts","../src/semantic/visitor.ts","../src/index.ts"],"names":["operator","value","field","values","result","jsonField","jsonValue","condition"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * NQL Error Types\n *\n * Structured error types for lexer, parser, and semantic errors.\n */\n\n/** Source location for error reporting */\nexport interface SourceLocation {\n\tline: number;\n\tcolumn: number;\n\toffset: number;\n}\n\n/** Base error interface for all NQL errors */\nexport interface NqlError {\n\tcode: string;\n\tmessage: string;\n\tlocation?: SourceLocation | undefined;\n\tsuggestion?: string | undefined;\n}\n\n/** Lexer errors (tokenization failures) */\ninterface NqlLexerError extends NqlError {\n\tcode: `ERR-LEX-${string}`;\n\tunexpectedChar?: string | undefined;\n}\n\n/** Parser errors (syntax errors) */\nexport interface NqlParseError extends NqlError {\n\tcode: `ERR-PARSE-${string}`;\n\texpected?: string[] | undefined;\n\tfound?: string | undefined;\n}\n\n/** Semantic errors (validation failures) */\nexport interface NqlSemanticError extends NqlError {\n\tcode: `ERR-SEM-${string}`;\n\trelatedSymbol?: string | undefined;\n}\n\n/** Warning (non-fatal issues) */\nexport interface NqlWarning {\n\tcode: string;\n\tmessage: string;\n\tlocation?: SourceLocation | undefined;\n\tsuggestion?: string | undefined;\n}\n\n/** Error codes enum for type safety */\nexport const NqlErrorCodes = {\n\t// Lexer errors\n\tLEX_UNEXPECTED_CHAR: 'ERR-LEX-001',\n\tLEX_UNTERMINATED_STRING: 'ERR-LEX-002',\n\tLEX_INVALID_NUMBER: 'ERR-LEX-003',\n\n\t// Parser errors\n\tPARSE_UNEXPECTED_TOKEN: 'ERR-PARSE-001',\n\tPARSE_MISSING_WHERE: 'ERR-PARSE-002',\n\tPARSE_INVALID_SUBQUERY: 'ERR-PARSE-003',\n\tPARSE_UNCLOSED_PAREN: 'ERR-PARSE-004',\n\n\t// Semantic errors\n\tSEM_UNKNOWN_COLUMN: 'ERR-SEM-001',\n\tSEM_AGGREGATE_BEFORE_GROUP: 'ERR-SEM-002',\n\tSEM_CIRCULAR_REFERENCE: 'ERR-SEM-003',\n\tSEM_DUPLICATE_BINDING: 'ERR-SEM-004',\n\tSEM_UNKNOWN_TABLE: 'ERR-SEM-005',\n\tSEM_INVALID_IDENTIFIER: 'ERR-SEM-006',\n\tSEM_INVALID_SYNTAX: 'ERR-SEM-007',\n\tSEM_UNREACHABLE: 'ERR-SEM-008',\n\n\t// Limit errors\n\tLIMIT_SUBQUERY_DEPTH: 'ERR-LIMIT-001',\n\tLIMIT_CLAUSE_COUNT: 'ERR-LIMIT-002',\n\tLIMIT_JOIN_COUNT: 'ERR-LIMIT-003',\n} as const;\n\n/** Create a formatted error message with location */\nexport function formatError(error: NqlError): string {\n\tlet msg = `[${error.code}] ${error.message}`;\n\tif (error.location) {\n\t\tmsg += ` (line ${error.location.line}, column ${error.location.column})`;\n\t}\n\tif (error.suggestion) {\n\t\tmsg += `\\n → ${error.suggestion}`;\n\t}\n\treturn msg;\n}\n\n/** Create a lexer error */\nexport function createLexerError(\n\tcode: string,\n\tmessage: string,\n\tlocation?: SourceLocation,\n\tunexpectedChar?: string,\n): NqlLexerError {\n\treturn {\n\t\tcode: code as `ERR-LEX-${string}`,\n\t\tmessage,\n\t\tlocation: location as SourceLocation | undefined,\n\t\tunexpectedChar: unexpectedChar as string | undefined,\n\t};\n}\n\n/** Create a parse error */\nexport function createParseError(\n\tcode: string,\n\tmessage: string,\n\tlocation?: SourceLocation,\n\texpected?: string[],\n\tfound?: string,\n): NqlParseError {\n\treturn {\n\t\tcode: code as `ERR-PARSE-${string}`,\n\t\tmessage,\n\t\tlocation: location as SourceLocation | undefined,\n\t\texpected: expected as string[] | undefined,\n\t\tfound: found as string | undefined,\n\t};\n}\n\n/** Create a semantic error */\nexport function createSemanticError(\n\tcode: string,\n\tmessage: string,\n\tlocation?: SourceLocation,\n\tsuggestion?: string,\n\trelatedSymbol?: string,\n): NqlSemanticError {\n\treturn {\n\t\tcode: code as `ERR-SEM-${string}`,\n\t\tmessage,\n\t\tlocation: location as SourceLocation | undefined,\n\t\tsuggestion: suggestion as string | undefined,\n\t\trelatedSymbol: relatedSymbol as string | undefined,\n\t};\n}\n\n/**\n * Throwable semantic error class.\n * Extends Error for compatibility with catch/toThrow patterns\n * while carrying structured NQL error metadata.\n */\nexport class NqlSemanticException extends Error {\n\treadonly code: `ERR-SEM-${string}`;\n\treadonly location?: SourceLocation | undefined;\n\treadonly suggestion?: string | undefined;\n\treadonly relatedSymbol?: string | undefined;\n\n\tconstructor(\n\t\tcode: string,\n\t\tmessage: string,\n\t\tlocation?: SourceLocation,\n\t\tsuggestion?: string,\n\t\trelatedSymbol?: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'NqlSemanticException';\n\t\tthis.code = code as `ERR-SEM-${string}`;\n\t\tthis.location = location as SourceLocation | undefined;\n\t\tthis.suggestion = suggestion as string | undefined;\n\t\tthis.relatedSymbol = relatedSymbol as string | undefined;\n\t}\n}\n","/**\n * @module compiler/column-validator\n * Schema-based column and table validation for the NQL compiler.\n */\n\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/index.js';\nimport type { ColumnValidatorSchema } from './types.js';\n\n/**\n * Validates column references against the schema.\n * When no schema is provided, validation is skipped (backward compat).\n */\nexport class ColumnValidator {\n\tprivate knownCteTables: Set<string> = new Set();\n\n\tconstructor(private readonly schema: ColumnValidatorSchema) {}\n\n\t/**\n\t * Register CTE names so validateTable() skips validation for them.\n\t * CTE names are not physical tables in the schema, but are valid FROM targets.\n\t */\n\taddKnownCteTables(names: Iterable<string>): void {\n\t\tfor (const name of names) {\n\t\t\tthis.knownCteTables.add(name);\n\t\t}\n\t}\n\n\t/** Clear all registered CTE table names (used between compilations). */\n\tclearKnownCteTables(): void {\n\t\tthis.knownCteTables.clear();\n\t}\n\n\t/**\n\t * Convert camelCase to snake_case for column name matching.\n\t * NQL queries may use either form (e.g., viewCount or view_count).\n\t */\n\tprivate static toSnakeCase(name: string): string {\n\t\treturn name.replace(/[A-Z]/g, (ch) => `_${ch.toLowerCase()}`);\n\t}\n\n\t/**\n\t * Check if a query column matches a schema column.\n\t * Accepts exact match OR snake_case ↔ camelCase equivalence.\n\t */\n\tprivate static columnsMatch(queryCol: string, schemaCol: string): boolean {\n\t\tif (queryCol === schemaCol) return true;\n\t\t// Compare snake_case forms: camelCase schema name vs snake_case query name\n\t\treturn (\n\t\t\tColumnValidator.toSnakeCase(queryCol) ===\n\t\t\tColumnValidator.toSnakeCase(schemaCol)\n\t\t);\n\t}\n\n\tvalidateColumn(table: string, column: string): void {\n\t\t/* v8 ignore next — '*' columns are validated at call-site before reaching here -- @preserve */\n\t\tif (column === '*') return;\n\t\tconst tableInfo = this.schema.getTable(table);\n\t\t/* v8 ignore next — graceful degradation: unknown tables skip validation -- @preserve */\n\t\tif (!tableInfo) return; // Unknown table → graceful degradation\n\t\tconst exists = tableInfo.columns.some((c) =>\n\t\t\tColumnValidator.columnsMatch(column, c.name),\n\t\t);\n\t\tif (!exists) {\n\t\t\tconst available = tableInfo.columns.map((c) => c.name).join(', ');\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_UNKNOWN_COLUMN,\n\t\t\t\t`Column '${column}' does not exist on table '${table}'. Available columns: ${available}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tvalidateTable(table: string): void {\n\t\t// CTE names are valid table references even though they are not in the schema\n\t\tif (this.knownCteTables.has(table)) return;\n\t\tconst tableInfo = this.schema.getTable(table);\n\t\tif (!tableInfo) {\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_UNKNOWN_TABLE,\n\t\t\t\t`Table '${table}' does not exist in the schema`,\n\t\t\t);\n\t\t}\n\t}\n\n\tresolveRelationTarget(\n\t\tsourceTable: string,\n\t\trelationName: string,\n\t): string | undefined {\n\t\tconst relations = this.schema.getRelationsFrom(sourceTable);\n\t\tconst rel = relations.find((r) => r.name === relationName);\n\t\treturn rel?.target;\n\t}\n}\n","/**\n * @module compiler/expression-utils\n * Pure expression utility functions for the NQL compiler.\n * No shared state — all functions are stateless.\n */\n\nimport type { ComparisonOperator, FieldRef } from '@dbsp/types';\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/types.js';\nimport type {\n\tNqlBinaryExpression,\n\tNqlExpression,\n\tNqlPathExpression,\n\tNqlRangeLiteral,\n\tNqlUnaryExpression,\n} from '../parser/ast.js';\nimport type { CompilerContext } from './types.js';\n\n/**\n * Extract a field name from an expression, or null if not a simple field reference.\n */\nexport function expressionToField(\n\texpr: NqlExpression,\n\taliasContext?: string,\n): string | null {\n\tif (expr.type === 'path') {\n\t\tconst segments = expr.segments;\n\t\t// Strip relation filter alias prefix (e.g., \"o.status\" → \"status\" when alias is \"o\")\n\t\tif (aliasContext && segments.length > 1 && segments[0] === aliasContext) {\n\t\t\treturn segments.slice(1).join('.');\n\t\t}\n\t\treturn segments.join('.');\n\t}\n\treturn null;\n}\n\n/**\n * Convert an expression to a plain value for use in intents.\n */\nexport function expressionToValue(expr: NqlExpression): unknown {\n\tswitch (expr.type) {\n\t\tcase 'string':\n\t\t\treturn expr.value;\n\t\tcase 'number':\n\t\t\treturn expr.value;\n\t\tcase 'boolean':\n\t\t\treturn expr.value;\n\t\tcase 'null':\n\t\t\treturn null;\n\t\tcase 'path':\n\t\t\t// Path in value context → treat as field reference (for computed columns)\n\t\t\treturn { $ref: expr.segments.join('.') };\n\t\tcase 'function': {\n\t\t\t// Function call in value context → special value\n\t\t\treturn {\n\t\t\t\t$fn: expr.name,\n\t\t\t\t$args: expr.args.map((a) => expressionToValue(a)),\n\t\t\t};\n\t\t}\n\t\tcase 'binary': {\n\t\t\t// Arithmetic expression → special value\n\t\t\tconst binary = expr as NqlBinaryExpression;\n\t\t\treturn {\n\t\t\t\t$op: binary.operator,\n\t\t\t\t$left: expressionToValue(binary.left),\n\t\t\t\t$right: expressionToValue(binary.right),\n\t\t\t};\n\t\t}\n\t\tcase 'unary': {\n\t\t\t// Unary expression (e.g., -price, -5)\n\t\t\tconst unary = expr as NqlUnaryExpression;\n\t\t\tif (unary.operator === '-') {\n\t\t\t\tconst operand = expressionToValue(unary.operand);\n\t\t\t\t// Optimize: if operand is a number, negate it directly\n\t\t\t\tif (typeof operand === 'number') {\n\t\t\t\t\treturn -operand;\n\t\t\t\t}\n\t\t\t\t// Otherwise, represent as multiplication by -1\n\t\t\t\treturn {\n\t\t\t\t\t$op: '*',\n\t\t\t\t\t$left: -1,\n\t\t\t\t\t$right: operand,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// 'not' operator shouldn't reach here (handled in compileExpression)\n\t\t\tthrow new Error(\n\t\t\t\t`Unsupported unary operator in value context: ${unary.operator}`,\n\t\t\t);\n\t\t}\n\t\tcase 'rangeLiteral': {\n\t\t\tconst range = expr as NqlRangeLiteral;\n\t\t\tconst lb = range.lowerInclusive ? '[' : '(';\n\t\t\tconst ub = range.upperInclusive ? ']' : ')';\n\t\t\treturn `${lb}${range.lower},${range.upper}${ub}`;\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error(`Cannot convert ${expr.type} to value`);\n\t}\n}\n\n/**\n * Convert an expression to a SQL-like string representation.\n */\nexport function expressionToSql(expr: NqlExpression): string {\n\tswitch (expr.type) {\n\t\tcase 'path':\n\t\t\treturn expr.segments.join('.');\n\t\tcase 'string':\n\t\t\treturn `'${expr.value.replace(/'/g, \"''\")}'`;\n\t\tcase 'number':\n\t\t\treturn String(expr.value);\n\t\tcase 'boolean':\n\t\t\treturn expr.value ? 'true' : 'false';\n\t\tcase 'null':\n\t\t\treturn 'NULL';\n\t\tcase 'function':\n\t\t\treturn `${expr.name}(${expr.args.map((a) => expressionToSql(a)).join(', ')})`;\n\t\tcase 'binary': {\n\t\t\tconst binary = expr as NqlBinaryExpression;\n\t\t\treturn `(${expressionToSql(binary.left)} ${binary.operator} ${expressionToSql(binary.right)})`;\n\t\t}\n\t\tcase 'unary': {\n\t\t\tconst unary = expr as NqlUnaryExpression;\n\t\t\treturn `${unary.operator} ${expressionToSql(unary.operand)}`;\n\t\t}\n\t\t// L-7: the old default was `return String(expr)` which silently emitted\n\t\t// '[object Object]' for any unrecognised expression type. This is a\n\t\t// programming error (unreachable code path) — SEM_UNREACHABLE is the\n\t\t// correct code because a new expression type was added without a handler,\n\t\t// not because the user provided invalid NQL syntax.\n\t\tdefault:\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_UNREACHABLE,\n\t\t\t\t`Cannot convert expression type '${(expr as { type?: unknown }).type ?? 'unknown'}' to SQL fragment`,\n\t\t\t);\n\t}\n}\n\n/**\n * Extract range value from expression (for range operators).\n * Returns either the raw range literal string or a scalar value.\n */\nexport function expressionToRangeValue(expr: NqlExpression): string {\n\tif (expr.type === 'rangeLiteral') {\n\t\tconst range = expr as NqlRangeLiteral;\n\t\treturn range.value;\n\t}\n\t// For scalar values (e.g., `contains 25`), convert to string\n\tif (expr.type === 'number') {\n\t\treturn String(expr.value);\n\t}\n\tif (expr.type === 'string') {\n\t\treturn expr.value;\n\t}\n\tthrow new Error(\n\t\t`Range operator requires a range literal or scalar value, got ${expr.type}`,\n\t);\n}\n\n/**\n * Resolve a filter RHS value, producing FieldRef when inside an aliased relation filter.\n * Outside alias context, delegates to expressionToValue().\n */\nexport function resolveFilterValue(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\taliasContext?: string,\n\touterAliases?: string[],\n): unknown {\n\t// No alias context → standard value resolution (literals, $ref, etc.)\n\tif (!aliasContext) return expressionToValue(expr);\n\n\t// Only path expressions can produce FieldRef\n\tif (expr.type === 'path') {\n\t\tconst segments = (expr as NqlPathExpression).segments;\n\t\t// alias-prefixed: e.g., \"r.col\" when aliasContext = \"r\"\n\t\tif (segments.length > 1 && segments[0] === aliasContext) {\n\t\t\tconst column = segments.slice(1).join('.');\n\t\t\t// Validate inner scope column against relation's target table\n\t\t\tif (ctx.currentRelationTarget && !column.includes('.')) {\n\t\t\t\tctx.validator?.validateColumn(ctx.currentRelationTarget, column);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: 'fieldRef',\n\t\t\t\tcolumn,\n\t\t\t\tscope: 'inner',\n\t\t\t} satisfies FieldRef;\n\t\t}\n\t\t// outer alias-prefixed: e.g., \"x.col\" when outerAliases includes \"x\"\n\t\tconst firstSegment = segments[0];\n\t\tif (\n\t\t\touterAliases &&\n\t\t\tfirstSegment &&\n\t\t\tsegments.length > 1 &&\n\t\t\touterAliases.includes(firstSegment)\n\t\t) {\n\t\t\tconst column = segments.slice(1).join('.');\n\t\t\t// Outer alias → validate against root table\n\t\t\tif (ctx.currentFromTable && !column.includes('.')) {\n\t\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, column);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tkind: 'fieldRef',\n\t\t\t\tcolumn,\n\t\t\t\tscope: 'outer',\n\t\t\t\talias: firstSegment,\n\t\t\t} satisfies FieldRef;\n\t\t}\n\t\t// bare column in aliased context → outer scope reference to root table\n\t\tconst bareColumn = segments.join('.');\n\t\tif (ctx.currentFromTable && !bareColumn.includes('.')) {\n\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, bareColumn);\n\t\t}\n\t\treturn {\n\t\t\tkind: 'fieldRef',\n\t\t\tcolumn: bareColumn,\n\t\t\tscope: 'outer',\n\t\t} satisfies FieldRef;\n\t}\n\n\t// Non-path expressions (literals, functions, etc.) → standard value\n\treturn expressionToValue(expr);\n}\n\n/**\n * Map a comparison operator string to a ComparisonOperator enum value.\n */\nexport function mapComparisonOperator(\n\top: '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',\n): ComparisonOperator {\n\tswitch (op) {\n\t\tcase '=':\n\t\t\treturn 'eq';\n\t\tcase '!=':\n\t\t\treturn 'neq';\n\t\tcase '<':\n\t\t\treturn 'lt';\n\t\tcase '>':\n\t\t\treturn 'gt';\n\t\tcase '<=':\n\t\t\treturn 'lte';\n\t\tcase '>=':\n\t\t\treturn 'gte';\n\t\tdefault:\n\t\t\tthrow new Error(`Cannot map operator ${op} to ComparisonOperator`);\n\t}\n}\n\n/**\n * Check if a function name is an aggregate function.\n */\nexport function isAggregateFunction(name: string): boolean {\n\treturn [\n\t\t'count',\n\t\t'sum',\n\t\t'avg',\n\t\t'min',\n\t\t'max',\n\t\t'array_agg',\n\t\t'string_agg',\n\t].includes(name.toLowerCase());\n}\n\n/**\n * Validate a WHERE field reference against the current table context.\n * Handles dotted paths (relation.column) and aliased context (relation filters).\n */\nexport function validateWhereField(\n\tctx: CompilerContext,\n\tfield: string,\n\taliasContext?: string,\n\toriginalExpr?: NqlExpression,\n): void {\n\tif (!ctx.validator) return;\n\tif (aliasContext) {\n\t\t// Inside relation filter — determine if field is inner or outer scope\n\t\tconst isInnerScope =\n\t\t\toriginalExpr?.type === 'path' &&\n\t\t\t(originalExpr as NqlPathExpression).segments.length > 1 &&\n\t\t\t(originalExpr as NqlPathExpression).segments[0] === aliasContext;\n\t\tif (isInnerScope) {\n\t\t\t// Inner scope → validate against relation's target table\n\t\t\tif (ctx.currentRelationTarget && !field.includes('.')) {\n\t\t\t\tctx.validator.validateColumn(ctx.currentRelationTarget, field);\n\t\t\t}\n\t\t} else {\n\t\t\t// Outer scope (bare column or non-alias-prefixed) → validate against root table\n\t\t\tif (ctx.currentFromTable && !field.includes('.')) {\n\t\t\t\tctx.validator.validateColumn(ctx.currentFromTable, field);\n\t\t\t}\n\t\t}\n\t\treturn;\n\t}\n\t// If inside a relation filter (dot-syntax, no alias), validate against relation target\n\tif (ctx.currentRelationTarget && !field.includes('.')) {\n\t\tctx.validator.validateColumn(ctx.currentRelationTarget, field);\n\t\treturn;\n\t}\n\t// Simple column on root table\n\tif (ctx.currentFromTable && !field.includes('.')) {\n\t\tctx.validator.validateColumn(ctx.currentFromTable, field);\n\t}\n}\n\n/**\n * Coerce an NQL expression to a string key for use in JSON paths, LIKE patterns,\n * and similar positions that require a string literal.\n *\n * Dispatch rules:\n * - string literal → use `.value` directly\n * - single-segment path → treat the identifier name as the key (prevents `String({$ref:...})` → `'[object Object]'`)\n * - multi-segment dotted path → throw SEM_INVALID_SYNTAX (ambiguous — caller cannot know which segment to use)\n * - anything else → throw SEM_INVALID_SYNTAX\n *\n * @param expr - The NQL expression to coerce.\n * @param contextLabel - Human-readable label for the position (e.g. `\"LIKE pattern\"`, `\"json_extract() path argument\"`) used in error messages.\n */\nexport function coerceToStringKey(\n\texpr: NqlExpression,\n\tcontextLabel: string,\n): string {\n\tif (expr.type === 'path') {\n\t\tconst segments = (expr as NqlPathExpression).segments;\n\t\tif (segments.length > 1) {\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t`${contextLabel} must be a string literal or a single identifier, not a dotted path`,\n\t\t\t);\n\t\t}\n\t\t// Single-segment path: treat the identifier as the string key value.\n\t\tconst key = expressionToField(expr);\n\t\t/* v8 ignore next — defensive: single-segment path always resolves to non-null */\n\t\tif (!key) {\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t`${contextLabel} must be a string literal or a single identifier`,\n\t\t\t);\n\t\t}\n\t\treturn key;\n\t}\n\tif (expr.type === 'string') {\n\t\treturn (expr as { type: 'string'; value: string }).value;\n\t}\n\tthrow new NqlSemanticException(\n\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t`${contextLabel} must be a string literal`,\n\t);\n}\n","/* biome-ignore-all lint/style/noNonNullAssertion: NQL AST node access requires non-null assertions on validated parse tree */\n/**\n * @module compiler/include-builder\n * Build nested IncludeIntent trees from relation paths and apply per-include limits.\n */\n\nimport type { IncludeIntent } from '@dbsp/types';\n\n/**\n * Build nested IncludeIntent[] from a set of dotted relation paths.\n *\n * Given paths like:\n * - \"userRoles.role\"\n * - \"userRoles.role.rolePermissions.permission\"\n *\n * Produces:\n * [{ relation: \"userRoles\", include: [\n * { relation: \"role\", include: [\n * { relation: \"rolePermissions\", include: [\n * { relation: \"permission\" }\n * ]}\n * ]}\n * ]}]\n *\n * Strategy-agnostic: the planner/adapter decides execution strategy.\n * flatMode propagates to all levels when enabled.\n */\nexport function buildNestedIncludes(\n\tpaths: Set<string>,\n\tflatMode: boolean,\n): IncludeIntent[] {\n\t// Build a tree structure from all paths\n\tinterface TreeNode {\n\t\tchildren: Map<string, TreeNode>;\n\t}\n\tconst root: TreeNode = { children: new Map() };\n\n\tfor (const path of paths) {\n\t\tconst segments = path.split('.');\n\t\tlet node = root;\n\t\tfor (const segment of segments) {\n\t\t\tif (!node.children.has(segment)) {\n\t\t\t\tnode.children.set(segment, { children: new Map() });\n\t\t\t}\n\t\t\tnode = node.children.get(segment)!;\n\t\t}\n\t}\n\n\t// Convert tree to nested IncludeIntent[]\n\tfunction treeToIncludes(node: TreeNode): IncludeIntent[] {\n\t\tconst includes: IncludeIntent[] = [];\n\t\tfor (const [relation, child] of node.children) {\n\t\t\tconst childIncludes = treeToIncludes(child);\n\t\t\tconst include: IncludeIntent = {\n\t\t\t\trelation,\n\t\t\t\t...(flatMode ? { strategy: 'flat' as const } : {}),\n\t\t\t\t...(childIncludes.length > 0 ? { include: childIncludes } : {}),\n\t\t\t};\n\t\t\tincludes.push(include);\n\t\t}\n\t\treturn includes;\n\t}\n\n\treturn treeToIncludes(root);\n}\n\n/**\n * Apply a per-include limit to the correct level of a nested include tree.\n * Also sets strategy to 'flat' (LATERAL required for per-parent limiting).\n */\nexport function applyIncludeLimit(\n\tincludes: IncludeIntent[],\n\tpath: string,\n\tlimit: number,\n): void {\n\tconst segments = path.split('.');\n\tconst root = segments[0]!;\n\tconst idx = includes.findIndex((inc) => inc.relation === root);\n\t/* v8 ignore next — defensive: callers always pass valid relation paths -- @preserve */\n\tif (idx === -1) return;\n\n\tif (segments.length === 1) {\n\t\t// Top-level: apply limit + implicit flat (LATERAL required for per-parent limit)\n\t\tincludes[idx] = {\n\t\t\t...includes[idx]!,\n\t\t\tlimit,\n\t\t\tstrategy: 'flat',\n\t\t};\n\t} else {\n\t\t// Deep path: force flat on intermediate segment (LATERAL cascade required)\n\t\t// and recurse into nested includes\n\t\tconst nested = [...(includes[idx]?.include ?? [])];\n\t\tapplyIncludeLimit(nested, segments.slice(1).join('.'), limit);\n\t\tincludes[idx] = { ...includes[idx]!, strategy: 'flat', include: nested };\n\t}\n}\n","/* biome-ignore-all lint/style/noNonNullAssertion: NQL AST node access requires non-null assertions on validated parse tree */\n/**\n * @module compiler/compile-query\n * Compiles NQL queries to QueryIntent (SELECT statements with clauses).\n */\n\nimport type {\n\tIncludeIntent,\n\tLockIntent,\n\tOrderByIntent,\n\tQueryIntent,\n\tSelectIntent,\n\tSetOperationIntent,\n\tSetOperationType,\n\tWhereIntent,\n} from '@dbsp/types';\nimport type { Mutable } from '@dbsp/types/internal';\nimport type {\n\tNqlGroupByClause,\n\tNqlLimitClause,\n\tNqlLockClause,\n\tNqlOffsetClause,\n\tNqlOrderByClause,\n\tNqlOrderItem,\n\tNqlQuery,\n\tNqlSelectClause,\n\tNqlSetClause,\n\tNqlWhereClause,\n} from '../parser/ast.js';\nimport { expressionToField, expressionToSql } from './expression-utils.js';\nimport { applyIncludeLimit, buildNestedIncludes } from './include-builder.js';\nimport type { CompilerContext, CompilerFns } from './types.js';\n\n/**\n * Compile a full NQL query to a QueryIntent or SetOperationIntent.\n * When the query contains a set clause (UNION/INTERSECT/EXCEPT),\n * the result is a SetOperationIntent wrapping the left and right queries.\n */\nexport function compileQuery(\n\tquery: NqlQuery,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: ReadonlyMap<string, QueryIntent>,\n): QueryIntent | SetOperationIntent {\n\t// Check for set operation clause\n\tconst setClauseIndex = query.clauses.findIndex(\n\t\t(c) => c.type === 'setOperation',\n\t);\n\tif (setClauseIndex >= 0) {\n\t\treturn compileSetOperation(query, setClauseIndex, ctx, fns, bindings);\n\t}\n\tctx.currentFromTable = query.table;\n\tctx.validator?.validateTable(query.table);\n\n\t// Track if we've seen groupBy (for WHERE vs HAVING)\n\tlet groupByIndex = -1;\n\tfor (let i = 0; i < query.clauses.length; i++) {\n\t\tif (query.clauses[i]?.type === 'groupBy') {\n\t\t\tgroupByIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Process clauses and collect results\n\tconst whereConditions: WhereIntent[] = [];\n\tconst havingConditions: WhereIntent[] = [];\n\tlet select: SelectIntent | undefined;\n\tlet distinct: boolean | undefined;\n\tconst allIncludes: IncludeIntent[] = [];\n\tlet currentIncludeBatch: IncludeIntent[] | undefined;\n\tlet groupBy: readonly string[] | undefined;\n\tlet orderBy: readonly OrderByIntent[] | undefined;\n\tlet limit: number | undefined;\n\tlet offset: number | undefined;\n\tlet flatMode = false;\n\tlet lock: LockIntent | undefined;\n\tconst includeLimits = new Map<string, number>();\n\n\tfor (let i = 0; i < query.clauses.length; i++) {\n\t\tconst clause = query.clauses[i]!;\n\n\t\tswitch (clause.type) {\n\t\t\tcase 'where': {\n\t\t\t\tconst condition = fns.compileExpression(\n\t\t\t\t\t(clause as NqlWhereClause).condition,\n\t\t\t\t\tctx,\n\t\t\t\t\tfns,\n\t\t\t\t);\n\t\t\t\tif (groupByIndex >= 0 && i > groupByIndex) {\n\t\t\t\t\thavingConditions.push(condition);\n\t\t\t\t} /* v8 ignore start — not yet reachable: include-batch WHERE merging requires WITH clause (not yet in grammar) -- @preserve */ else if (\n\t\t\t\t\tcurrentIncludeBatch &&\n\t\t\t\t\tcurrentIncludeBatch.length > 0\n\t\t\t\t) {\n\t\t\t\t\tconst targetInclude =\n\t\t\t\t\t\tcurrentIncludeBatch[currentIncludeBatch.length - 1]!;\n\t\t\t\t\tconst mutableInclude = targetInclude as Mutable<IncludeIntent>;\n\t\t\t\t\tif (targetInclude.where) {\n\t\t\t\t\t\tmutableInclude.where = {\n\t\t\t\t\t\t\tkind: 'and',\n\t\t\t\t\t\t\tconditions: [targetInclude.where, condition],\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmutableInclude.where = condition;\n\t\t\t\t\t}\n\t\t\t\t} /* v8 ignore stop -- @preserve */ else {\n\t\t\t\t\twhereConditions.push(condition);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'select':\n\t\t\t\tselect = fns.compileSelectClause(clause as NqlSelectClause, ctx, fns);\n\t\t\t\tdistinct = (clause as NqlSelectClause).distinct || undefined;\n\t\t\t\tbreak;\n\t\t\tcase 'flat':\n\t\t\t\tflatMode = true;\n\t\t\t\tbreak;\n\t\t\tcase 'groupBy':\n\t\t\t\tgroupBy = compileGroupByClause(clause as NqlGroupByClause, ctx);\n\t\t\t\tcurrentIncludeBatch = undefined;\n\t\t\t\tbreak;\n\t\t\tcase 'orderBy':\n\t\t\t\torderBy = compileOrderByClause(clause as NqlOrderByClause, ctx);\n\t\t\t\tbreak;\n\t\t\tcase 'limit': {\n\t\t\t\tconst lc = clause as NqlLimitClause;\n\t\t\t\tif (lc.relation) {\n\t\t\t\t\tincludeLimits.set(lc.relation, lc.count);\n\t\t\t\t} else {\n\t\t\t\t\tlimit = lc.count;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'offset':\n\t\t\t\toffset = (clause as NqlOffsetClause).count;\n\t\t\t\tbreak;\n\t\t\tcase 'lock': {\n\t\t\t\tconst lc = clause as NqlLockClause;\n\t\t\t\tlock = { strength: lc.strength, waitPolicy: lc.waitPolicy };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'bind':\n\t\t\t\t// Bind is a metadata marker — extracted by extractBindName(), no compilation needed\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Auto-generate includes from relation paths in SELECT\n\tif (select && select.type === 'expressions') {\n\t\tconst relationPaths = new Set<string>();\n\t\tfor (const expr of select.columns) {\n\t\t\tif (expr.kind === 'relationColumn') {\n\t\t\t\trelationPaths.add(expr.relation);\n\t\t\t}\n\t\t}\n\t\tif (relationPaths.size > 0) {\n\t\t\tconst nestedIncludes = buildNestedIncludes(relationPaths, flatMode);\n\t\t\tfor (const inc of nestedIncludes) {\n\t\t\t\tconst exists = allIncludes.some(\n\t\t\t\t\t(existing) => existing.relation === inc.relation,\n\t\t\t\t);\n\t\t\t\tif (!exists) {\n\t\t\t\t\tallIncludes.push(inc);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Apply flat mode strategy to pre-existing includes\n\t/* v8 ignore next — not yet reachable: flat + pre-existing includes requires WITH clause -- @preserve */\n\tif (flatMode && allIncludes.length > 0) {\n\t\tfor (let i = 0; i < allIncludes.length; i++) {\n\t\t\tconst inc = allIncludes[i]!;\n\t\t\tif (!inc.strategy) {\n\t\t\t\tallIncludes[i] = { ...inc, strategy: 'flat' } as IncludeIntent;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Apply per-include limits\n\tif (includeLimits.size > 0) {\n\t\tfor (const [relation, limitCount] of includeLimits) {\n\t\t\tconst rootRelation = relation.split('.')[0]!;\n\t\t\tconst targetInclude = allIncludes.find(\n\t\t\t\t(inc) => inc.relation === rootRelation,\n\t\t\t);\n\t\t\tif (!targetInclude) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`limit for relation '${relation}' specified but '${rootRelation}' is not included in the query`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tapplyIncludeLimit(allIncludes, relation, limitCount);\n\t\t}\n\t}\n\n\tconst include: readonly IncludeIntent[] | undefined =\n\t\tallIncludes.length > 0 ? allIncludes : undefined;\n\n\t// Combine WHERE conditions\n\tlet where: WhereIntent | undefined;\n\tif (whereConditions.length === 1) {\n\t\twhere = whereConditions[0];\n\t} else if (whereConditions.length > 1) {\n\t\twhere = { kind: 'and', conditions: whereConditions };\n\t}\n\n\t// Combine HAVING conditions\n\tlet having: WhereIntent | undefined;\n\tif (havingConditions.length === 1) {\n\t\thaving = havingConditions[0];\n\t} else if (havingConditions.length > 1) {\n\t\thaving = { kind: 'and', conditions: havingConditions };\n\t}\n\n\treturn {\n\t\ttype: 'select',\n\t\tfrom: query.table,\n\t\t...(select !== undefined && { select }),\n\t\t...(where !== undefined && { where }),\n\t\t...(include !== undefined && { include }),\n\t\t...(orderBy !== undefined && { orderBy }),\n\t\t...(groupBy !== undefined && { groupBy }),\n\t\t...(having !== undefined && { having }),\n\t\t...(distinct !== undefined && { distinct }),\n\t\t...(limit !== undefined && { limit }),\n\t\t...(offset !== undefined && { offset }),\n\t\t...(lock !== undefined && { lock }),\n\t};\n}\n\n/**\n * Compile a set operation (UNION/INTERSECT/EXCEPT).\n * Splits clauses at the set clause: before = left query, set operand = right query.\n */\n\n/**\n * Count the explicit output columns from a QueryIntent's select clause.\n * Returns undefined when the count is indeterminate (SELECT * / no select).\n */\nfunction getExplicitColumnCount(\n\tintent: QueryIntent | SetOperationIntent,\n): number | undefined {\n\tif ('kind' in intent && intent.kind === 'setOperation') {\n\t\t// For nested set ops, the output width matches the left branch\n\t\treturn getExplicitColumnCount(intent.left);\n\t}\n\tconst q = intent as QueryIntent;\n\tif (!q.select) return undefined;\n\tswitch (q.select.type) {\n\t\tcase 'all':\n\t\t\treturn undefined;\n\t\t/* v8 ignore next — NQL compiler never produces 'fields' in set operations (always expressions or all) -- @preserve */\n\t\tcase 'fields':\n\t\t\treturn q.select.fields.length;\n\t\t/* v8 ignore next — NQL compiler never produces 'aggregate' SelectIntent directly -- @preserve */\n\t\tcase 'aggregate':\n\t\t\treturn (q.select.fields?.length ?? 0) + q.select.aggregates.length;\n\t\tcase 'expressions':\n\t\t\treturn q.select.columns.length;\n\t\t/* v8 ignore next — defensive: exhaustive switch -- @preserve */\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction compileSetOperation(\n\tquery: NqlQuery,\n\tsetClauseIndex: number,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: ReadonlyMap<string, QueryIntent>,\n): SetOperationIntent {\n\tconst setClause = query.clauses[setClauseIndex] as NqlSetClause;\n\n\t// Left side: all clauses before the set operation\n\tconst leftQuery: NqlQuery = {\n\t\ttype: 'query',\n\t\ttable: query.table,\n\t\tclauses: query.clauses.slice(0, setClauseIndex),\n\t};\n\tconst left = compileQuery(leftQuery, ctx, fns, bindings) as QueryIntent;\n\n\t// Right side: inline sub-query or bound name reference\n\tlet right: QueryIntent | SetOperationIntent;\n\tif (setClause.right) {\n\t\tright = compileQuery(setClause.right, ctx, fns, bindings);\n\t} else if (setClause.boundName) {\n\t\tconst bound = bindings?.get(setClause.boundName);\n\t\tif (!bound) {\n\t\t\tthrow new Error(\n\t\t\t\t`Set operation references unbound name '${setClause.boundName}'. Use | bind ${setClause.boundName} in a preceding statement.`,\n\t\t\t);\n\t\t}\n\t\tright = bound;\n\t} /* v8 ignore start — defensive: parser guarantees right or boundName -- @preserve */ else {\n\t\tthrow new Error('Set operation missing right operand');\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\t// Validate column count compatibility when both sides are explicit\n\tconst leftCount = getExplicitColumnCount(left);\n\tconst rightCount = getExplicitColumnCount(right);\n\tif (\n\t\tleftCount !== undefined &&\n\t\trightCount !== undefined &&\n\t\tleftCount !== rightCount\n\t) {\n\t\tthrow new Error(\n\t\t\t`${setClause.op.toUpperCase()} requires both sides to have the same number of columns (left: ${leftCount}, right: ${rightCount})`,\n\t\t);\n\t}\n\n\treturn {\n\t\tkind: 'setOperation',\n\t\top: setClause.op as SetOperationType,\n\t\tall: setClause.all,\n\t\tleft,\n\t\tright,\n\t};\n}\n\n/**\n * Compile a GROUP BY clause to field names.\n */\nfunction compileGroupByClause(\n\tclause: NqlGroupByClause,\n\tctx: CompilerContext,\n): readonly string[] {\n\treturn clause.expressions.map((expr) => {\n\t\tif (expr.type === 'path') {\n\t\t\tconst field = expr.segments.join('.');\n\t\t\tif (ctx.currentFromTable && !field.includes('.')) {\n\t\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, field);\n\t\t\t}\n\t\t\treturn field;\n\t\t}\n\t\treturn expressionToSql(expr);\n\t});\n}\n\n/**\n * Compile an ORDER BY clause to OrderByIntent[].\n */\nfunction compileOrderByClause(\n\tclause: NqlOrderByClause,\n\tctx: CompilerContext,\n): readonly OrderByIntent[] {\n\treturn clause.items.map((item) => compileOrderItem(item, ctx));\n}\n\n/**\n * Compile a single ORDER BY item.\n */\nfunction compileOrderItem(\n\titem: NqlOrderItem,\n\tctx: CompilerContext,\n): OrderByIntent {\n\tconst field = expressionToField(item.expression);\n\tif (field) {\n\t\tif (ctx.currentFromTable && !field.includes('.') && !field.includes('(')) {\n\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, field);\n\t\t}\n\t\treturn { field, direction: item.direction };\n\t}\n\tconst sqlExpr = expressionToSql(item.expression);\n\treturn { field: sqlExpr, direction: item.direction };\n}\n","/* biome-ignore-all lint/style/noNonNullAssertion: NQL AST node access requires non-null assertions on validated parse tree */\n/**\n * @module compiler/compile-cte\n * Compiles NQL WITH/CTE syntax to CteQueryIntent.\n */\n\nimport type { CteQueryIntent, QueryIntent, SimpleCteIntent } from '@dbsp/types';\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/index.js';\nimport type { NqlWithQuery } from '../parser/ast.js';\nimport { compileQuery } from './compile-query.js';\nimport type { CompileResult, CompilerContext, CompilerFns } from './types.js';\n\n/**\n * Compile an NQL WITH query (CTE syntax) to a CteQueryIntent.\n *\n * Algorithm:\n * 1. Collect CTE names, validate no duplicates.\n * 2. Register CTE names in validator to bypass table existence check.\n * 3. Compile each CTE body to QueryIntent (set ops in CTE body → error).\n * 4. Compile outer query (CTE names are now known tables).\n * 5. Clear CTE names from validator.\n * 6. Return CteQueryIntent.\n */\nexport function compileWithQuery(\n\tastNode: NqlWithQuery,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n): CompileResult {\n\t// 1. Validate no duplicate CTE names\n\tconst cteNames = new Set<string>();\n\tfor (const cte of astNode.ctes) {\n\t\tif (cteNames.has(cte.name)) {\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_DUPLICATE_BINDING,\n\t\t\t\t`Duplicate CTE name: '${cte.name}'. Each CTE must have a unique name.`,\n\t\t\t);\n\t\t}\n\t\tcteNames.add(cte.name);\n\t}\n\n\t// 2. Register CTE names in validator so outer query can reference them\n\tctx.validator?.addKnownCteTables(cteNames);\n\n\ttry {\n\t\t// 3. Compile each CTE body\n\t\tconst ctes: SimpleCteIntent[] = [];\n\t\tfor (const cte of astNode.ctes) {\n\t\t\tconst bodyResult = compileQuery(cte.query, ctx, fns);\n\t\t\t// Set operations in CTE body not supported in v1\n\t\t\tif ('kind' in bodyResult && bodyResult.kind === 'setOperation') {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_UNKNOWN_TABLE,\n\t\t\t\t\t`Set operations (union/intersect/except) in CTE body are not supported yet. Found in CTE '${cte.name}'.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tctes.push({\n\t\t\t\tkind: 'simpleCte',\n\t\t\t\tname: cte.name,\n\t\t\t\tquery: bodyResult as QueryIntent,\n\t\t\t});\n\t\t}\n\n\t\t// 4. Compile outer query (CTE names are registered as known tables)\n\t\tconst outerResult = compileQuery(astNode.query, ctx, fns);\n\t\tif ('kind' in outerResult && outerResult.kind === 'setOperation') {\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_UNKNOWN_TABLE,\n\t\t\t\t'Set operations in the outer query of a WITH clause are not supported yet.',\n\t\t\t);\n\t\t}\n\n\t\tconst cteQueryIntent: CteQueryIntent = {\n\t\t\tkind: 'cteQuery',\n\t\t\tctes,\n\t\t\tquery: outerResult as QueryIntent,\n\t\t};\n\n\t\treturn { cteQuery: cteQueryIntent };\n\t} finally {\n\t\t// 5. Always clear CTE names to avoid state leakage between compilations\n\t\tctx.validator?.clearKnownCteTables();\n\t}\n}\n","/**\n * @module compiler/date-range-patterns\n * Date range pattern detection and expansion for IN (dateRange) clauses.\n *\n * Supports: YYYY, YYYY-QN, YYYY-MM, YYYY-WNN\n * Expansion: always half-open intervals [start, end) — >= start AND < end.\n */\n\nconst DATE_RANGE_YEAR = /^(\\d{4})$/;\nconst DATE_RANGE_QUARTER = /^(\\d{4})-Q([1-4])$/;\nconst DATE_RANGE_MONTH = /^(\\d{4})-(\\d{2})$/;\nconst DATE_RANGE_WEEK = /^(\\d{4})-W(\\d{2})$/;\n\n/**\n * Check if a string matches any date range pattern (YYYY, YYYY-QN, YYYY-MM, YYYY-WNN).\n * Does NOT validate ranges (e.g., month 13 would return true).\n * Use `expandDateRange()` for full validation.\n */\nexport function isDateRangePattern(value: string): boolean {\n\treturn (\n\t\tDATE_RANGE_YEAR.test(value) ||\n\t\tDATE_RANGE_QUARTER.test(value) ||\n\t\tDATE_RANGE_MONTH.test(value) ||\n\t\tDATE_RANGE_WEEK.test(value)\n\t);\n}\n\nexport class InvalidDateRangeError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = 'InvalidDateRangeError';\n\t}\n}\n\n/**\n * Expand a date range pattern into half-open interval [start, end).\n *\n * @returns `{ start, end }` where the interval is >= start AND < end.\n * @throws InvalidDateRangeError for invalid patterns.\n */\nexport function expandDateRange(pattern: string): {\n\tstart: string;\n\tend: string;\n} {\n\tlet match: RegExpMatchArray | null;\n\n\t// YYYY → full year\n\tmatch = pattern.match(DATE_RANGE_YEAR);\n\tif (match) {\n\t\tconst year = Number(match[1]);\n\t\treturn {\n\t\t\tstart: `${year}-01-01`,\n\t\t\tend: `${year + 1}-01-01`,\n\t\t};\n\t}\n\n\t// YYYY-QN → quarter\n\tmatch = pattern.match(DATE_RANGE_QUARTER);\n\tif (match) {\n\t\tconst year = Number(match[1]);\n\t\tconst quarter = Number(match[2]);\n\t\tconst startMonth = (quarter - 1) * 3 + 1;\n\t\tconst endMonth = startMonth + 3;\n\t\tif (endMonth > 12) {\n\t\t\treturn {\n\t\t\t\tstart: `${year}-${pad(startMonth)}-01`,\n\t\t\t\tend: `${year + 1}-01-01`,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tstart: `${year}-${pad(startMonth)}-01`,\n\t\t\tend: `${year}-${pad(endMonth)}-01`,\n\t\t};\n\t}\n\n\t// YYYY-MM → month\n\tmatch = pattern.match(DATE_RANGE_MONTH);\n\tif (match) {\n\t\tconst year = Number(match[1]);\n\t\tconst month = Number(match[2]);\n\t\tif (month < 1 || month > 12) {\n\t\t\tthrow new InvalidDateRangeError(\n\t\t\t\t`Invalid month '${match[2]}' in date range '${pattern}' — must be 01-12`,\n\t\t\t);\n\t\t}\n\t\tif (month === 12) {\n\t\t\treturn {\n\t\t\t\tstart: `${year}-12-01`,\n\t\t\t\tend: `${year + 1}-01-01`,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tstart: `${year}-${pad(month)}-01`,\n\t\t\tend: `${year}-${pad(month + 1)}-01`,\n\t\t};\n\t}\n\n\t// YYYY-WNN → ISO 8601 week\n\tmatch = pattern.match(DATE_RANGE_WEEK);\n\tif (match) {\n\t\tconst year = Number(match[1]);\n\t\tconst week = Number(match[2]);\n\t\tconst maxWeeks = getISOWeekCount(year);\n\t\tif (week < 1 || week > maxWeeks) {\n\t\t\tthrow new InvalidDateRangeError(\n\t\t\t\t`Invalid week 'W${match[2]}' in date range '${pattern}' — year ${year} has ${maxWeeks} ISO weeks`,\n\t\t\t);\n\t\t}\n\t\tconst start = isoWeekToDate(year, week);\n\t\tconst end = addDays(start, 7);\n\t\treturn {\n\t\t\tstart: formatDate(start),\n\t\t\tend: formatDate(end),\n\t\t};\n\t}\n\n\tthrow new InvalidDateRangeError(\n\t\t`Invalid date range '${pattern}' — expected YYYY, YYYY-QN, YYYY-MM, or YYYY-WNN`,\n\t);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction pad(n: number): string {\n\treturn n < 10 ? `0${n}` : `${n}`;\n}\n\nfunction formatDate(d: Date): string {\n\treturn `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;\n}\n\nfunction addDays(d: Date, days: number): Date {\n\tconst result = new Date(d.getTime());\n\tresult.setUTCDate(result.getUTCDate() + days);\n\treturn result;\n}\n\n/**\n * ISO 8601 week-to-date: Monday of week W in year Y.\n * W01 contains the year's first Thursday (= contains January 4th).\n */\nfunction isoWeekToDate(year: number, week: number): Date {\n\t// January 4th is always in ISO week 1\n\tconst jan4 = new Date(Date.UTC(year, 0, 4));\n\t// Day of week (Mon=1..Sun=7 in ISO)\n\tconst jan4Dow = jan4.getUTCDay() || 7; // Convert Sunday=0 to 7\n\t// Monday of week 1\n\tconst mondayW1 = new Date(jan4.getTime());\n\tmondayW1.setUTCDate(jan4.getUTCDate() - (jan4Dow - 1));\n\t// Monday of week N\n\tconst result = new Date(mondayW1.getTime());\n\tresult.setUTCDate(mondayW1.getUTCDate() + (week - 1) * 7);\n\treturn result;\n}\n\n/**\n * Number of ISO 8601 weeks in a year.\n * A year has 53 weeks if Jan 1 is Thursday, or Dec 31 is Thursday.\n * (Leap years: Jan 1 is Thursday or Wednesday → 53 weeks)\n */\nfunction getISOWeekCount(year: number): number {\n\tconst jan1 = new Date(Date.UTC(year, 0, 1));\n\tconst dec31 = new Date(Date.UTC(year, 11, 31));\n\tconst jan1Dow = jan1.getUTCDay();\n\tconst dec31Dow = dec31.getUTCDay();\n\t// Thursday = 4\n\treturn jan1Dow === 4 || dec31Dow === 4 ? 53 : 52;\n}\n","/* biome-ignore-all lint/style/noNonNullAssertion: NQL AST node access requires non-null assertions on validated parse tree */\n/**\n * @module compiler/compile-expression\n * Compiles NQL boolean expressions to WhereIntent (WHERE/HAVING clauses).\n */\n\nimport type {\n\tQueryIntent,\n\tWhereAnyIntent,\n\tWhereComparisonIntent,\n\tWhereInIntent,\n\tWhereIntent,\n\tWhereJsonContainsIntent,\n\tWhereJsonExistsIntent,\n\tWhereRangeIntent,\n} from '@dbsp/types';\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/types.js';\nimport type {\n\tNqlAnyExpression,\n\tNqlBetweenExpression,\n\tNqlBinaryExpression,\n\tNqlComparisonExpression,\n\tNqlExpression,\n\tNqlInExpression,\n\tNqlIsNullExpression,\n\tNqlJsonAccessExpression,\n\tNqlJsonComparisonExpression,\n\tNqlRangeOpExpression,\n\tNqlRelationFilterExpression,\n\tNqlUnaryExpression,\n} from '../parser/ast.js';\nimport { expandDateRange, isDateRangePattern } from './date-range-patterns.js';\nimport {\n\tcoerceToStringKey,\n\texpressionToField,\n\texpressionToRangeValue,\n\tmapComparisonOperator,\n\tresolveFilterValue,\n\tvalidateWhereField,\n} from './expression-utils.js';\nimport type { CompilerContext, CompilerFns } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Handler functions (extracted from switch cases)\n// ---------------------------------------------------------------------------\n\nfunction compileLogical(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\tif (expr.type === 'binary') {\n\t\tconst binary = expr as NqlBinaryExpression;\n\t\tif (binary.operator === 'and') {\n\t\t\treturn {\n\t\t\t\tkind: 'and',\n\t\t\t\tconditions: [\n\t\t\t\t\tcompileExpression(binary.left, ctx, fns, aliasContext, outerAliases),\n\t\t\t\t\tcompileExpression(binary.right, ctx, fns, aliasContext, outerAliases),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\tif (binary.operator === 'or') {\n\t\t\treturn {\n\t\t\t\tkind: 'or',\n\t\t\t\tconditions: [\n\t\t\t\t\tcompileExpression(binary.left, ctx, fns, aliasContext, outerAliases),\n\t\t\t\t\tcompileExpression(binary.right, ctx, fns, aliasContext, outerAliases),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\t/* v8 ignore start — defensive: only and/or reach here; arithmetic is in SELECT context -- @preserve */\n\t\t// Arithmetic binary → comparison context shouldn't reach here\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t`Unsupported binary operator in WHERE: ${binary.operator}`,\n\t\t);\n\t\t/* v8 ignore stop -- @preserve */\n\t}\n\n\t// unary\n\tconst unary = expr as NqlUnaryExpression;\n\tif (unary.operator === 'not') {\n\t\treturn {\n\t\t\tkind: 'not',\n\t\t\tcondition: compileExpression(\n\t\t\t\tunary.operand,\n\t\t\t\tctx,\n\t\t\t\tfns,\n\t\t\t\taliasContext,\n\t\t\t\touterAliases,\n\t\t\t),\n\t\t};\n\t}\n\t/* v8 ignore next — defensive: only 'not' unary reaches WHERE context -- @preserve */\n\tthrow new NqlSemanticException(\n\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t`Unsupported unary operator: ${unary.operator}`,\n\t);\n}\n\nfunction compileComparison(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\t_fns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\tconst comp = expr as NqlComparisonExpression;\n\n\t// JSON access on LHS: data->'key' = 'val'\n\tif (comp.left.type === 'jsonAccess') {\n\t\tconst jsonLeft = comp.left as NqlJsonAccessExpression;\n\t\tconst baseField = expressionToField(jsonLeft.base, aliasContext);\n\t\t/* v8 ignore start — defensive: jsonAccess base is always a path expression -- @preserve */\n\t\tif (!baseField) {\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t'JSON access base must be a field reference',\n\t\t\t);\n\t\t}\n\t\t/* v8 ignore stop -- @preserve */\n\t\tconst operator = mapComparisonOperator(comp.operator);\n\t\tconst value = resolveFilterValue(\n\t\t\tcomp.right,\n\t\t\tctx,\n\t\t\taliasContext,\n\t\t\touterAliases,\n\t\t);\n\t\treturn {\n\t\t\tkind: 'comparison',\n\t\t\tfield: baseField,\n\t\t\toperator,\n\t\t\tvalue,\n\t\t\tjsonPath: jsonLeft.path,\n\t\t\tjsonMode: jsonLeft.mode,\n\t\t} satisfies WhereComparisonIntent;\n\t}\n\n\t// JSON function on LHS: json_extract_text(data, 'key') = 'val'\n\tif (comp.left.type === 'function') {\n\t\tconst fn = comp.left.name.toLowerCase();\n\t\tif (fn === 'json_extract' || fn === 'json_extract_text') {\n\t\t\t/* v8 ignore start — defensive: parser guarantees at least 2 args for json_extract -- @preserve */\n\t\t\tif (comp.left.args.length < 2) {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t\t`${fn}() requires at least 2 arguments`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore stop -- @preserve */\n\t\t\tconst baseField = expressionToField(comp.left.args[0]!, aliasContext);\n\t\t\t/* v8 ignore start — defensive: first arg is always a field reference -- @preserve */\n\t\t\tif (!baseField) {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t\t`${fn}() first argument must be a field reference`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore stop -- @preserve */\n\t\t\t// Each path argument after the first is a JSON key: must be a string literal\n\t\t\t// or a single identifier. String(resolveFilterValue(...)) would silently emit\n\t\t\t// '[object Object]' for path expressions — use coerceToStringKey instead.\n\t\t\tconst keys = comp.left.args\n\t\t\t\t.slice(1)\n\t\t\t\t.map((a) => coerceToStringKey(a, `${fn}() path argument`));\n\t\t\tconst operator = mapComparisonOperator(comp.operator);\n\t\t\tconst value = resolveFilterValue(\n\t\t\t\tcomp.right,\n\t\t\t\tctx,\n\t\t\t\taliasContext,\n\t\t\t\touterAliases,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tkind: 'comparison',\n\t\t\t\tfield: baseField,\n\t\t\t\toperator,\n\t\t\t\tvalue,\n\t\t\t\tjsonPath: keys,\n\t\t\t\tjsonMode: fn === 'json_extract' ? 'json' : 'text',\n\t\t\t} satisfies WhereComparisonIntent;\n\t\t}\n\t}\n\n\tconst field = expressionToField(comp.left, aliasContext);\n\t/* v8 ignore start — defensive: parser guarantees LHS is a path expression -- @preserve */\n\tif (!field) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Left side of comparison must be a field reference',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\t// Validate WHERE column on current table context\n\tvalidateWhereField(ctx, field, aliasContext, comp.left);\n\n\t// Handle LIKE specially: RHS must be a string literal or single-segment identifier path.\n\t// Dotted paths and expression nodes are rejected by coerceToStringKey().\n\t// String(resolveFilterValue(...)) would silently yield '[object Object]' for path refs.\n\tif (comp.operator === 'like') {\n\t\treturn {\n\t\t\tkind: 'like',\n\t\t\tfield,\n\t\t\tpattern: coerceToStringKey(comp.right, 'LIKE pattern'),\n\t\t};\n\t}\n\n\tconst operator = mapComparisonOperator(comp.operator);\n\tconst value = resolveFilterValue(comp.right, ctx, aliasContext, outerAliases);\n\n\treturn {\n\t\tkind: 'comparison',\n\t\tfield,\n\t\toperator,\n\t\tvalue,\n\t};\n}\n\nfunction compileRange(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\t_fns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\tconst rangeExpr = expr as NqlRangeOpExpression;\n\tconst field = expressionToField(rangeExpr.left, aliasContext);\n\t/* v8 ignore start — defensive: parser guarantees LHS is a path expression -- @preserve */\n\tif (!field) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Left side of range operator must be a field reference',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tvalidateWhereField(ctx, field, aliasContext, rangeExpr.left);\n\t// Handle both range literals and scalar values\n\tlet rangeValue: string | unknown;\n\tif (rangeExpr.range) {\n\t\trangeValue = expressionToRangeValue(rangeExpr.range);\n\t} else if (rangeExpr.scalar) {\n\t\t// Scalar value for \"contains\" operator (e.g., contains 25)\n\t\trangeValue = resolveFilterValue(\n\t\t\trangeExpr.scalar,\n\t\t\tctx,\n\t\t\taliasContext,\n\t\t\touterAliases,\n\t\t);\n\t} /* v8 ignore start — defensive: parser guarantees range or scalar -- @preserve */ else {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Range operator requires either a range literal or scalar value',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\treturn {\n\t\tkind: 'range',\n\t\tfield,\n\t\toperator: rangeExpr.operator,\n\t\tvalue: rangeValue,\n\t} as WhereRangeIntent;\n}\n\nfunction compileMembership(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\tif (expr.type === 'any') {\n\t\tconst anyExpr = expr as NqlAnyExpression;\n\t\tconst field = expressionToField(anyExpr.column, aliasContext);\n\t\t/* v8 ignore start — defensive: parser guarantees ANY LHS is a path expression -- @preserve */\n\t\tif (!field) {\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t'ANY expression must reference a field',\n\t\t\t);\n\t\t}\n\t\t/* v8 ignore stop -- @preserve */\n\t\tvalidateWhereField(ctx, field, aliasContext, anyExpr.column);\n\t\tconst rawValues = ctx.params[anyExpr.paramName];\n\t\tconst values: readonly unknown[] = Array.isArray(rawValues)\n\t\t\t? rawValues\n\t\t\t: [];\n\t\treturn { kind: 'any', field, values } satisfies WhereAnyIntent;\n\t}\n\n\t// in\n\tconst inExpr = expr as NqlInExpression;\n\tconst field = expressionToField(inExpr.expression, aliasContext);\n\t/* v8 ignore start — defensive: parser guarantees IN LHS is a path expression -- @preserve */\n\tif (!field) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'IN expression must reference a field',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tvalidateWhereField(ctx, field, aliasContext, inExpr.expression);\n\n\tlet values: unknown[];\n\tif (Array.isArray(inExpr.values)) {\n\t\tvalues = inExpr.values.map((v) =>\n\t\t\tresolveFilterValue(v, ctx, aliasContext, outerAliases),\n\t\t);\n\n\t\t// Amendment 11: detect if ALL values are date range patterns → expand to OR of ANDs\n\t\tconst dateRangeValues = values.filter(\n\t\t\t(v): v is string => typeof v === 'string' && isDateRangePattern(v),\n\t\t);\n\t\tif (dateRangeValues.length > 0) {\n\t\t\tif (dateRangeValues.length !== values.length) {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t\t'Cannot mix date range patterns with regular values in IN list. ' +\n\t\t\t\t\t\t'Use all date ranges or all literals.',\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn expandDateRangeList(field, dateRangeValues, inExpr.negated);\n\t\t}\n\t} else if ('type' in inExpr.values && inExpr.values.type === 'subquery') {\n\t\t// Subquery is a full QueryIntent — contextual validation at adapter level\n\t\t// Subqueries in IN clauses are always simple queries, never set operations\n\t\tconst subquery = fns.compileQuery(inExpr.values.query, ctx) as QueryIntent;\n\n\t\tconst result: WhereInIntent = {\n\t\t\tkind: 'in',\n\t\t\tfield,\n\t\t\tvalues: [],\n\t\t\tsubquery,\n\t\t};\n\n\t\tif (inExpr.negated) {\n\t\t\treturn { kind: 'not', condition: result };\n\t\t}\n\n\t\treturn result;\n\t} else if ('type' in inExpr.values && inExpr.values.type === 'dateRange') {\n\t\t// Single date range: 'YYYY-Q1' → >= start AND < end (half-open)\n\t\treturn expandDateRangeList(field, [inExpr.values.value], inExpr.negated);\n\t} else {\n\t\tvalues = [];\n\t}\n\n\tconst result: WhereInIntent = {\n\t\tkind: 'in',\n\t\tfield,\n\t\tvalues,\n\t};\n\n\tif (inExpr.negated) {\n\t\treturn { kind: 'not', condition: result };\n\t}\n\n\treturn result;\n}\n\nfunction compileBetween(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\t_fns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\tconst between = expr as NqlBetweenExpression;\n\tconst field = expressionToField(between.expression, aliasContext);\n\t/* v8 ignore start — defensive: parser guarantees BETWEEN LHS is a path -- @preserve */\n\tif (!field) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'BETWEEN expression must reference a field',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tvalidateWhereField(ctx, field, aliasContext, between.expression);\n\n\tconst lower = resolveFilterValue(\n\t\tbetween.low,\n\t\tctx,\n\t\taliasContext,\n\t\touterAliases,\n\t);\n\tconst upper = resolveFilterValue(\n\t\tbetween.high,\n\t\tctx,\n\t\taliasContext,\n\t\touterAliases,\n\t);\n\n\tif (\n\t\tlower !== null &&\n\t\ttypeof lower !== 'number' &&\n\t\ttypeof lower !== 'string' &&\n\t\t!(lower instanceof Date)\n\t) {\n\t\t// L-6: actionable message — tell the user what the lower bound was\n\t\tconst got =\n\t\t\ttypeof lower === 'object' ? 'path reference' : JSON.stringify(lower);\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t`BETWEEN lower bound must be a literal number, string, or date — got ${got}. Use a param or hardcoded value.`,\n\t\t);\n\t}\n\tif (\n\t\tupper !== null &&\n\t\ttypeof upper !== 'number' &&\n\t\ttypeof upper !== 'string' &&\n\t\t!(upper instanceof Date)\n\t) {\n\t\t// L-6: actionable message — tell the user what the upper bound was\n\t\tconst got =\n\t\t\ttypeof upper === 'object' ? 'path reference' : JSON.stringify(upper);\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t`BETWEEN upper bound must be a literal number, string, or date — got ${got}. Use a param or hardcoded value.`,\n\t\t);\n\t}\n\n\treturn {\n\t\tkind: 'range',\n\t\tfield,\n\t\toperator: 'between',\n\t\tvalue: { lower, upper },\n\t};\n}\n\nfunction compileNull(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\taliasContext?: string,\n): WhereIntent {\n\tconst isNull = expr as NqlIsNullExpression;\n\tconst field = expressionToField(isNull.expression, aliasContext);\n\t/* v8 ignore start — defensive: parser guarantees IS NULL LHS is a path -- @preserve */\n\tif (!field) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'IS NULL expression must reference a field',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tvalidateWhereField(ctx, field, aliasContext, isNull.expression);\n\n\treturn {\n\t\tkind: 'null',\n\t\tfield,\n\t\toperator: isNull.negated ? 'isNotNull' : 'isNull',\n\t};\n}\n\nfunction compileJson(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\t_fns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\tif (expr.type === 'function') {\n\t\t// JSON function notation in WHERE context\n\t\tconst fn = expr.name.toLowerCase();\n\t\tif (fn === 'json_contains' || fn === 'json_contained_by') {\n\t\t\t/* v8 ignore start — defensive: parser guarantees at least 2 args -- @preserve */\n\t\t\tif (expr.args.length < 2) {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t\t`${fn}() requires 2 arguments: field and value`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore stop -- @preserve */\n\t\t\tconst jsonField = expressionToField(expr.args[0]!, aliasContext);\n\t\t\t/* v8 ignore start — defensive: first arg is always a field reference -- @preserve */\n\t\t\tif (!jsonField) {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t\t`${fn}() first argument must be a field reference`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore stop -- @preserve */\n\t\t\tconst jsonValue = resolveFilterValue(\n\t\t\t\texpr.args[1]!,\n\t\t\t\tctx,\n\t\t\t\taliasContext,\n\t\t\t\touterAliases,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tkind: 'jsonContains',\n\t\t\t\tfield: jsonField,\n\t\t\t\tvalue: jsonValue,\n\t\t\t\treversed: fn === 'json_contained_by',\n\t\t\t} satisfies WhereJsonContainsIntent;\n\t\t}\n\t\tif (fn === 'json_exists') {\n\t\t\t/* v8 ignore start — defensive: parser guarantees at least 2 args -- @preserve */\n\t\t\tif (expr.args.length < 2) {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t\t`${fn}() requires 2 arguments: field and key`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore stop -- @preserve */\n\t\t\tconst jsonField = expressionToField(expr.args[0]!, aliasContext);\n\t\t\t/* v8 ignore start — defensive: first arg is always a field reference -- @preserve */\n\t\t\tif (!jsonField) {\n\t\t\t\tthrow new NqlSemanticException(\n\t\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t\t`${fn}() first argument must be a field reference`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore stop -- @preserve */\n\t\t\t// Route through coerceToStringKey: handles single-segment path identifiers\n\t\t\t// (e.g. json_exists(data, email) → key='email') and rejects dotted paths\n\t\t\t// and non-string values that would silently yield '[object Object]'.\n\t\t\tconst key = coerceToStringKey(expr.args[1]!, `${fn}() key`);\n\t\t\treturn {\n\t\t\t\tkind: 'jsonExists',\n\t\t\t\tfield: jsonField,\n\t\t\t\tkey,\n\t\t\t} satisfies WhereJsonExistsIntent;\n\t\t}\n\t\t/* v8 ignore next — defensive: only json_* functions reach WHERE context -- @preserve */\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t`Unsupported function in WHERE context: ${fn}()`,\n\t\t);\n\t}\n\n\t// jsonComparison\n\tconst jsonComp = expr as NqlJsonComparisonExpression;\n\tconst jsonField = expressionToField(jsonComp.left, aliasContext);\n\t/* v8 ignore start — defensive: parser guarantees LHS is a path expression -- @preserve */\n\tif (!jsonField) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Left side of JSON comparison must be a field reference',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\tif (jsonComp.operator === '?') {\n\t\t// S-3: String(resolveFilterValue(...)) would silently yield '[object Object]'\n\t\t// for path expressions — use coerceToStringKey to reject non-string RHS.\n\t\tconst key = coerceToStringKey(jsonComp.right, '? operator key');\n\t\treturn {\n\t\t\tkind: 'jsonExists',\n\t\t\tfield: jsonField,\n\t\t\tkey,\n\t\t} satisfies WhereJsonExistsIntent;\n\t}\n\n\t// @> or <@\n\tconst jsonValue = resolveFilterValue(\n\t\tjsonComp.right,\n\t\tctx,\n\t\taliasContext,\n\t\touterAliases,\n\t);\n\treturn {\n\t\tkind: 'jsonContains',\n\t\tfield: jsonField,\n\t\tvalue: jsonValue,\n\t\treversed: jsonComp.operator === '<@',\n\t} satisfies WhereJsonContainsIntent;\n}\n\nfunction compileRelationFilter(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\t// SPEC-002: Cross-table relation filters\n\tconst relFilter = expr as NqlRelationFilterExpression;\n\t// Build alias stack: current aliasContext (if any) becomes an outer alias for nested filters\n\tconst nestedOuterAliases = aliasContext\n\t\t? [...(outerAliases ?? []), aliasContext]\n\t\t: (outerAliases ?? []);\n\t// Resolve relation target for inner scope validation (first segment of relation path)\n\tconst prevRelationTarget = ctx.currentRelationTarget;\n\tif (ctx.currentFromTable && ctx.validator && relFilter.relation[0]) {\n\t\tctx.currentRelationTarget = ctx.validator.resolveRelationTarget(\n\t\t\tctx.currentFromTable,\n\t\t\trelFilter.relation[0],\n\t\t);\n\t}\n\tconst where = compileExpression(\n\t\trelFilter.condition,\n\t\tctx,\n\t\tfns,\n\t\trelFilter.alias,\n\t\tnestedOuterAliases,\n\t);\n\tctx.currentRelationTarget = prevRelationTarget;\n\treturn {\n\t\tkind: 'relationFilter',\n\t\trelation: relFilter.relation,\n\t\twhere,\n\t\tmode: relFilter.mode,\n\t\t...(relFilter.alias !== undefined && { alias: relFilter.alias }),\n\t};\n}\n\n// ---------------------------------------------------------------------------\n// Date range helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Expand one or more date range patterns into a WhereIntent.\n *\n * - Single pattern → WhereAndIntent (gte + lt)\n * - Multiple patterns → WhereOrIntent containing N WhereAndIntent children\n * - Negated → wraps in WhereNotIntent\n */\nfunction expandDateRangeList(\n\tfield: string,\n\tpatterns: string[],\n\tnegated: boolean,\n): WhereIntent {\n\tconst conditions = patterns.map((pattern) => {\n\t\tconst { start, end } = expandDateRange(pattern);\n\t\treturn {\n\t\t\tkind: 'and',\n\t\t\tconditions: [\n\t\t\t\t{\n\t\t\t\t\tkind: 'comparison',\n\t\t\t\t\tfield,\n\t\t\t\t\toperator: 'gte',\n\t\t\t\t\tvalue: start,\n\t\t\t\t} satisfies WhereComparisonIntent,\n\t\t\t\t{\n\t\t\t\t\tkind: 'comparison',\n\t\t\t\t\tfield,\n\t\t\t\t\toperator: 'lt',\n\t\t\t\t\tvalue: end,\n\t\t\t\t} satisfies WhereComparisonIntent,\n\t\t\t],\n\t\t} as WhereIntent;\n\t});\n\n\tconst result: WhereIntent =\n\t\tconditions.length === 1 ? conditions[0]! : { kind: 'or', conditions };\n\n\tif (negated) {\n\t\treturn { kind: 'not', condition: result };\n\t}\n\n\treturn result;\n}\n\n// ---------------------------------------------------------------------------\n// Main dispatcher (thin switch)\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a boolean expression to a WhereIntent tree.\n */\nexport function compileExpression(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\taliasContext?: string,\n\touterAliases?: string[],\n): WhereIntent {\n\tswitch (expr.type) {\n\t\tcase 'binary':\n\t\tcase 'unary':\n\t\t\treturn compileLogical(expr, ctx, fns, aliasContext, outerAliases);\n\t\tcase 'comparison':\n\t\t\treturn compileComparison(expr, ctx, fns, aliasContext, outerAliases);\n\t\tcase 'rangeOp':\n\t\t\treturn compileRange(expr, ctx, fns, aliasContext, outerAliases);\n\t\tcase 'in':\n\t\tcase 'any':\n\t\t\treturn compileMembership(expr, ctx, fns, aliasContext, outerAliases);\n\t\tcase 'between':\n\t\t\treturn compileBetween(expr, ctx, fns, aliasContext, outerAliases);\n\t\tcase 'isNull':\n\t\t\treturn compileNull(expr, ctx, aliasContext);\n\t\tcase 'jsonComparison':\n\t\tcase 'function':\n\t\t\treturn compileJson(expr, ctx, fns, aliasContext, outerAliases);\n\t\tcase 'relationFilter':\n\t\t\treturn compileRelationFilter(expr, ctx, fns, aliasContext, outerAliases);\n\t\tcase 'case':\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t'CASE in WHERE not supported. ' +\n\t\t\t\t\t'Use a computed column in SELECT or a relation filter instead.',\n\t\t\t);\n\t\tcase 'exists':\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t'EXISTS (subquery) is not supported in NQL. ' +\n\t\t\t\t\t'Use relation filters instead:\\n' +\n\t\t\t\t\t' orders | with customer | where customer.active = true\\n' +\n\t\t\t\t\t' orders | where exists(customer, active = true)\\n' +\n\t\t\t\t\t'These compile to efficient EXISTS subqueries automatically.',\n\t\t\t);\n\t\t/* v8 ignore next — defensive: all parser-produced expression types are handled above -- @preserve */\n\t\tdefault:\n\t\t\tthrow new NqlSemanticException(\n\t\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t\t`Unsupported expression type in WHERE: ${expr.type}`,\n\t\t\t);\n\t}\n}\n","/* biome-ignore-all lint/style/noNonNullAssertion: NQL AST node access requires non-null assertions on validated parse tree */\n/**\n * @module compiler/compile-mutation\n * Compiles NQL mutations (INSERT, UPDATE, DELETE, UPSERT) to MutationIntent.\n */\n\nimport type {\n\tDeleteIntent,\n\tInsertFromIntent,\n\tInsertIntent,\n\tMutationIntent,\n\tQueryIntent,\n\tSelectFieldsIntent,\n\tUpdateIntent,\n\tUpsertFromIntent,\n\tUpsertIntent,\n\tWhereAndIntent,\n\tWhereInIntent,\n\tWhereIntent,\n\tWhereNotIntent,\n\tWhereOrIntent,\n} from '@dbsp/types';\nimport type {\n\tNqlDelete,\n\tNqlInsert,\n\tNqlInsertFrom,\n\tNqlMutation,\n\tNqlMutationPipeline,\n\tNqlSelectClause,\n\tNqlStatement,\n\tNqlUpdate,\n\tNqlUpsert,\n\tNqlUpsertFrom,\n} from '../parser/ast.js';\nimport { expressionToField, expressionToValue } from './expression-utils.js';\nimport type { CompilerContext, CompilerFns } from './types.js';\n\n/**\n * Compile a mutation pipeline (mutation + clauses like RETURNING).\n */\nexport function compileMutationPipeline(\n\tpipeline: NqlMutationPipeline,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: Map<string, QueryIntent>,\n): { mutation: MutationIntent; returning?: readonly string[] } {\n\tctx.currentFromTable = pipeline.mutation.table;\n\n\tconst mutation = compileMutation(pipeline.mutation, ctx, fns, bindings);\n\n\t// Extract RETURNING from select clauses\n\tlet returning: readonly string[] | undefined;\n\tfor (const clause of pipeline.clauses) {\n\t\tif (clause.type === 'select') {\n\t\t\treturning = extractReturningColumns(clause, ctx);\n\t\t}\n\t}\n\n\tif (returning) {\n\t\treturn {\n\t\t\tmutation: { ...mutation, returning } as MutationIntent,\n\t\t};\n\t}\n\n\treturn { mutation };\n}\n\n/**\n * Compile a single mutation to MutationIntent.\n */\nfunction compileMutation(\n\tmutation: NqlMutation,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: Map<string, QueryIntent>,\n): MutationIntent {\n\tswitch (mutation.type) {\n\t\tcase 'insert':\n\t\t\treturn compileInsert(mutation, ctx);\n\t\tcase 'insert_from':\n\t\t\treturn compileInsertFrom(mutation, ctx, fns, bindings);\n\t\tcase 'update':\n\t\t\treturn compileUpdate(mutation, ctx, fns, bindings);\n\t\tcase 'delete':\n\t\t\treturn compileDelete(mutation, ctx, fns, bindings);\n\t\tcase 'upsert':\n\t\t\treturn compileUpsert(mutation, ctx);\n\t\tcase 'upsert_from':\n\t\t\treturn compileUpsertFrom(mutation, ctx, fns, bindings);\n\t}\n}\n\nfunction compileInsert(insert: NqlInsert, ctx: CompilerContext): InsertIntent {\n\tctx.validator?.validateTable(insert.table);\n\n\t// Collect all unique columns across all rows (column normalization)\n\tconst allColumns = new Set<string>();\n\tfor (const row of insert.rows) {\n\t\tfor (const assignment of row) {\n\t\t\tctx.validator?.validateColumn(insert.table, assignment.column);\n\t\t\tallColumns.add(assignment.column);\n\t\t}\n\t}\n\n\t// Build values array with normalized columns (missing → undefined → NULL)\n\tconst values: Record<string, unknown>[] = [];\n\tfor (const row of insert.rows) {\n\t\tconst rowValues: Record<string, unknown> = {};\n\t\tconst rowColumns = new Set<string>();\n\t\tfor (const assignment of row) {\n\t\t\trowColumns.add(assignment.column);\n\t\t\trowValues[assignment.column] = expressionToValue(assignment.value);\n\t\t}\n\t\tfor (const col of allColumns) {\n\t\t\tif (!rowColumns.has(col)) {\n\t\t\t\trowValues[col] = undefined;\n\t\t\t}\n\t\t}\n\t\tvalues.push(rowValues);\n\t}\n\n\treturn {\n\t\ttype: 'insert',\n\t\ttable: insert.table,\n\t\tvalues,\n\t};\n}\n\nfunction compileInsertFrom(\n\tinsertFrom: NqlInsertFrom,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: Map<string, QueryIntent>,\n): InsertFromIntent {\n\tconst sourceQuery = bindings?.get(insertFrom.source);\n\tctx.currentFromTable = insertFrom.source;\n\n\treturn {\n\t\ttype: 'insert_from',\n\t\ttable: insertFrom.table,\n\t\tsource: insertFrom.source,\n\t\t...(sourceQuery !== undefined && { sourceQuery }),\n\t\t/* v8 ignore next — NQL grammar does not produce explicit column lists for INSERT FROM -- @preserve */\n\t\t...(insertFrom.columns !== undefined && { columns: insertFrom.columns }),\n\t\t...(insertFrom.where !== undefined && {\n\t\t\twhere: fns.compileExpression(insertFrom.where, ctx, fns),\n\t\t}),\n\t\t...(insertFrom.limit !== undefined && { limit: insertFrom.limit }),\n\t};\n}\n\nfunction compileUpdate(\n\tupdate: NqlUpdate,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: Map<string, QueryIntent>,\n): UpdateIntent {\n\tctx.currentFromTable = update.table;\n\tctx.validator?.validateTable(update.table);\n\tconst set: Record<string, unknown> = {};\n\tfor (const assignment of update.assignments) {\n\t\tctx.validator?.validateColumn(update.table, assignment.column);\n\t\tset[assignment.column] = expressionToValue(assignment.value);\n\t}\n\n\tif (update.where) {\n\t\treturn {\n\t\t\ttype: 'update',\n\t\t\ttable: update.table,\n\t\t\tset,\n\t\t\twhere: resolveBindingsInWhere(\n\t\t\t\tfns.compileExpression(update.where, ctx, fns),\n\t\t\t\tbindings,\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: 'update',\n\t\ttable: update.table,\n\t\tset,\n\t\tallowAll: true,\n\t};\n}\n\nfunction compileDelete(\n\tdel: NqlDelete,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: Map<string, QueryIntent>,\n): DeleteIntent {\n\tctx.currentFromTable = del.table;\n\tctx.validator?.validateTable(del.table);\n\tif (del.where) {\n\t\treturn {\n\t\t\ttype: 'delete',\n\t\t\ttable: del.table,\n\t\t\twhere: resolveBindingsInWhere(\n\t\t\t\tfns.compileExpression(del.where, ctx, fns),\n\t\t\t\tbindings,\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: 'delete',\n\t\ttable: del.table,\n\t\tallowAll: true,\n\t};\n}\n\nfunction compileUpsert(upsert: NqlUpsert, ctx: CompilerContext): UpsertIntent {\n\tctx.validator?.validateTable(upsert.table);\n\tconst values: Record<string, unknown> = {};\n\tfor (const assignment of upsert.assignments) {\n\t\tctx.validator?.validateColumn(upsert.table, assignment.column);\n\t\tvalues[assignment.column] = expressionToValue(assignment.value);\n\t}\n\n\tfor (const col of upsert.conflictColumns) {\n\t\tctx.validator?.validateColumn(upsert.table, col);\n\t}\n\n\treturn {\n\t\ttype: 'upsert',\n\t\ttable: upsert.table,\n\t\tvalues: [values],\n\t\tonConflict: { columns: upsert.conflictColumns },\n\t\taction: { type: 'doUpdate', set: values },\n\t};\n}\n\nfunction compileUpsertFrom(\n\tupsertFrom: NqlUpsertFrom,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n\tbindings?: Map<string, QueryIntent>,\n): UpsertFromIntent {\n\tconst sourceQuery = bindings?.get(upsertFrom.source);\n\tctx.currentFromTable = upsertFrom.source;\n\n\treturn {\n\t\ttype: 'upsert_from',\n\t\ttable: upsertFrom.table,\n\t\tsource: upsertFrom.source,\n\t\tconflictColumns: upsertFrom.conflictColumns,\n\t\t...(sourceQuery !== undefined && { sourceQuery }),\n\t\t/* v8 ignore start — NQL grammar does not produce explicit column lists for UPSERT FROM -- @preserve */\n\t\t...(upsertFrom.columns !== undefined && {\n\t\t\tcolumns: upsertFrom.columns,\n\t\t}),\n\t\t/* v8 ignore stop -- @preserve */\n\t\t...(upsertFrom.where !== undefined && {\n\t\t\twhere: fns.compileExpression(upsertFrom.where, ctx, fns),\n\t\t}),\n\t\t...(upsertFrom.limit !== undefined && { limit: upsertFrom.limit }),\n\t};\n}\n\n/**\n * Extract RETURNING column names from a SELECT clause after a mutation.\n */\nfunction extractReturningColumns(\n\tclause: NqlSelectClause,\n\tctx: CompilerContext,\n): readonly string[] {\n\tconst columns: string[] = [];\n\n\tfor (const item of clause.items) {\n\t\tif (item.type === 'star') {\n\t\t\treturn ['*'];\n\t\t}\n\t\tif (item.type === 'expression') {\n\t\t\tconst field = expressionToField(item.expression);\n\t\t\tif (field) {\n\t\t\t\tif (ctx.currentFromTable && !field.includes('.')) {\n\t\t\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, field);\n\t\t\t\t}\n\t\t\t\tcolumns.push(item.alias ?? field);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn columns;\n}\n\n/**\n * Walk a WhereIntent tree and resolve any IN clause whose values contain\n * a $ref matching a bound CTE name → convert to subquery.\n */\nfunction resolveBindingsInWhere(\n\twhere: WhereIntent,\n\tbindings?: Map<string, QueryIntent>,\n): WhereIntent {\n\tif (!bindings || bindings.size === 0) return where;\n\n\tif (where.kind === 'in') {\n\t\tconst inWhere = where as WhereInIntent;\n\t\tif (inWhere.values && inWhere.values.length === 1) {\n\t\t\tconst val = inWhere.values[0];\n\t\t\tif (\n\t\t\t\tval &&\n\t\t\t\ttypeof val === 'object' &&\n\t\t\t\t'$ref' in (val as Record<string, unknown>)\n\t\t\t) {\n\t\t\t\tconst ref = (val as Record<string, unknown>).$ref as string;\n\t\t\t\tif (bindings.has(ref)) {\n\t\t\t\t\tconst boundQuery = bindings.get(ref)!;\n\t\t\t\t\tconst boundSelect = boundQuery.select;\n\t\t\t\t\t/* v8 ignore next — defensive: bound queries from NQL always have select.fields -- @preserve */\n\t\t\t\t\tconst selectFields: readonly string[] | undefined =\n\t\t\t\t\t\tboundSelect && 'fields' in boundSelect\n\t\t\t\t\t\t\t? (boundSelect as SelectFieldsIntent).fields\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst cteRef: QueryIntent = {\n\t\t\t\t\t\ttype: 'select',\n\t\t\t\t\t\tfrom: ref,\n\t\t\t\t\t\t...(selectFields && {\n\t\t\t\t\t\t\tselect: {\n\t\t\t\t\t\t\t\ttype: 'fields' as const,\n\t\t\t\t\t\t\t\tfields: selectFields,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t};\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkind: 'in',\n\t\t\t\t\t\tfield: inWhere.field,\n\t\t\t\t\t\tvalues: [],\n\t\t\t\t\t\tsubquery: cteRef,\n\t\t\t\t\t} as WhereInIntent;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn where;\n\t}\n\n\tif (where.kind === 'not') {\n\t\tconst notWhere = where as WhereNotIntent;\n\t\tconst resolved = resolveBindingsInWhere(notWhere.condition, bindings);\n\t\treturn resolved === notWhere.condition\n\t\t\t? where\n\t\t\t: { kind: 'not', condition: resolved };\n\t}\n\n\tif (where.kind === 'and' || where.kind === 'or') {\n\t\tconst compound = where as WhereAndIntent | WhereOrIntent;\n\t\tconst resolved = compound.conditions.map((c) =>\n\t\t\tresolveBindingsInWhere(c, bindings),\n\t\t);\n\t\tconst changed = resolved.some((r, i) => r !== compound.conditions[i]);\n\t\treturn changed ? { kind: compound.kind, conditions: resolved } : where;\n\t}\n\n\treturn where;\n}\n\n/**\n * Extract the bind name from a statement's clauses, if any.\n */\nexport function extractBindName(stmt: NqlStatement): string | undefined {\n\tif (stmt.type === 'query') {\n\t\tfor (const clause of stmt.clauses) {\n\t\t\tif (clause.type === 'bind') return clause.name;\n\t\t}\n\t} else if (stmt.type === 'mutationPipeline') {\n\t\tfor (const clause of stmt.clauses) {\n\t\t\tif (clause.type === 'bind') return clause.name;\n\t\t}\n\t}\n\treturn undefined;\n}\n","/* biome-ignore-all lint/style/noNonNullAssertion: NQL AST node access requires non-null assertions on validated parse tree */\n/**\n * @module compiler/compile-select\n * Compiles NQL SELECT clauses to SelectIntent and ExpressionIntent.\n */\n\nimport type {\n\tAggregateFunction,\n\tExpressionIntent,\n\tPseudoColumnTraversal,\n\tQueryIntent,\n\tSelectIntent,\n\tWindowFunction,\n} from '@dbsp/types';\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/types.js';\nimport type {\n\tNqlBooleanLiteral,\n\tNqlCaseExpression,\n\tNqlComparisonExpression,\n\tNqlExpression,\n\tNqlNumberLiteral,\n\tNqlPathExpression,\n\tNqlSelectClause,\n\tNqlSelectExpression,\n\tNqlSelectItem,\n\tNqlStringLiteral,\n\tNqlUnaryExpression,\n\tNqlWindowExpression,\n} from '../parser/ast.js';\nimport {\n\tcoerceToStringKey,\n\texpressionToField,\n\texpressionToSql,\n\texpressionToValue,\n\tisAggregateFunction,\n} from './expression-utils.js';\nimport type { CompilerContext, CompilerFns } from './types.js';\n\n/**\n * Compile a SELECT clause to a SelectIntent.\n */\nexport function compileSelectClause(\n\tclause: NqlSelectClause,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n): SelectIntent {\n\tif (clause.items.length === 1 && clause.items[0]?.type === 'star') {\n\t\treturn { type: 'all' };\n\t}\n\n\t// Check if all items are simple field references\n\tconst simpleFields: string[] = [];\n\tconst expressions: ExpressionIntent[] = [];\n\tlet hasExpressions = false;\n\n\tfor (const item of clause.items) {\n\t\tif (item.type === 'star') {\n\t\t\t// Star in multi-item select → use column with special '*' marker\n\t\t\thasExpressions = true;\n\t\t\texpressions.push({ kind: 'column', column: '*' });\n\t\t} else if (item.type === 'relationStar') {\n\t\t\t// relation.* → use relationColumn with '*' as column\n\t\t\thasExpressions = true;\n\t\t\tconst relation = item.relation.join('.');\n\t\t\texpressions.push({\n\t\t\t\tkind: 'relationColumn',\n\t\t\t\trelation,\n\t\t\t\tcolumn: '*',\n\t\t\t\tas: `${relation}.*`,\n\t\t\t});\n\t\t} else if (item.type === 'expression') {\n\t\t\tconst expr = item.expression;\n\t\t\tif (expr.type === 'path' && expr.segments.length === 1 && !item.alias) {\n\t\t\t\t// Simple field reference\n\t\t\t\tif (ctx.currentFromTable) {\n\t\t\t\t\tctx.validator?.validateColumn(\n\t\t\t\t\t\tctx.currentFromTable,\n\t\t\t\t\t\texpr.segments[0]!,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tsimpleFields.push(expr.segments[0]!);\n\t\t\t} else {\n\t\t\t\thasExpressions = true;\n\t\t\t}\n\t\t\texpressions.push(compileSelectExpression(item, ctx, fns));\n\t\t}\n\t}\n\n\tif (!hasExpressions) {\n\t\treturn { type: 'fields', fields: simpleFields };\n\t}\n\n\treturn { type: 'expressions', columns: expressions };\n}\n\n/**\n * Compile a single SELECT item to an ExpressionIntent.\n */\nfunction compileSelectExpression(\n\titem: NqlSelectItem,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n): ExpressionIntent {\n\t/* v8 ignore start — defensive: star items are handled in compileSelectClause before reaching here -- @preserve */\n\tif (item.type === 'star') {\n\t\treturn { kind: 'column', column: '*' };\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\t/* v8 ignore next — defensive: relationStar items are handled in compileSelectClause -- @preserve */\n\tif (item.type === 'relationStar') {\n\t\tconst relation = item.relation.join('.');\n\t\treturn {\n\t\t\tkind: 'relationColumn',\n\t\t\trelation,\n\t\t\tcolumn: '*',\n\t\t\tas: `${relation}.*`,\n\t\t};\n\t}\n\n\t// From here item.type === 'expression', alias is available\n\tconst exprItem = item as NqlSelectExpression;\n\tconst expr = exprItem.expression;\n\n\t// Check for functions (aggregate or regular)\n\tif (expr.type === 'function') {\n\t\tconst fn = expr.name.toLowerCase();\n\t\tif (isAggregateFunction(fn)) {\n\t\t\tlet field: string;\n\t\t\tif (expr.args.length === 0) {\n\t\t\t\tif (fn === 'count') {\n\t\t\t\t\tfield = '*';\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Aggregate function ${fn}() requires at least one argument`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfield =\n\t\t\t\t\texpressionToField(expr.args[0]!) ?? expressionToSql(expr.args[0]!);\n\t\t\t\tif (ctx.currentFromTable && field !== '*' && !field.includes('.')) {\n\t\t\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, field);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst extraArgs =\n\t\t\t\texpr.args.length > 1\n\t\t\t\t\t? expr.args\n\t\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t\t.map((a) => expressionToField(a) ?? expressionToValue(a))\n\t\t\t\t\t: undefined;\n\t\t\treturn {\n\t\t\t\tkind: 'aggregate',\n\t\t\t\tfunction: fn as AggregateFunction,\n\t\t\t\tfield,\n\t\t\t\t...(exprItem.alias !== undefined && { as: exprItem.alias }),\n\t\t\t\t...(expr.distinct && { distinct: true }),\n\t\t\t\t...(extraArgs && { extraArgs }),\n\t\t\t};\n\t\t}\n\t\t// JSON function notation → same intent as operator notation\n\t\tconst jsonIntent = compileJsonFunction(fn, expr.args, exprItem.alias);\n\t\tif (jsonIntent) return jsonIntent;\n\n\t\t// Non-aggregate function (e.g., now(), upper(), coalesce())\n\t\treturn {\n\t\t\tkind: 'function',\n\t\t\tname: expr.name,\n\t\t\targs: expr.args.map((a) => expressionToField(a) ?? expressionToValue(a)),\n\t\t\t...(exprItem.alias !== undefined && { as: exprItem.alias }),\n\t\t};\n\t}\n\n\t// Window expression\n\tif (expr.type === 'window') {\n\t\tconst windowExpr = expr as NqlWindowExpression;\n\t\tconst fn = windowExpr.function.toLowerCase() as WindowFunction;\n\n\t\tlet field: string | undefined;\n\t\tif (windowExpr.args.length > 0) {\n\t\t\tfield =\n\t\t\t\texpressionToField(windowExpr.args[0]!) ??\n\t\t\t\texpressionToSql(windowExpr.args[0]!);\n\t\t}\n\n\t\t// Extract offset and defaultValue for lag/lead (args[1] and args[2])\n\t\tlet offset: number | undefined;\n\t\tlet defaultValue: unknown;\n\t\tif (fn === 'lag' || fn === 'lead') {\n\t\t\tif (windowExpr.args.length > 1) {\n\t\t\t\toffset = expressionToValue(windowExpr.args[1]!) as number;\n\t\t\t}\n\t\t\tif (windowExpr.args.length > 2) {\n\t\t\t\tdefaultValue = expressionToValue(windowExpr.args[2]!);\n\t\t\t}\n\t\t}\n\n\t\tconst partitionBy =\n\t\t\twindowExpr.partitionBy.length > 0\n\t\t\t\t? windowExpr.partitionBy.map((e) => {\n\t\t\t\t\t\tconst f = expressionToField(e) ?? expressionToSql(e);\n\t\t\t\t\t\tif (ctx.currentFromTable && !f.includes('.') && !f.includes('(')) {\n\t\t\t\t\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, f);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn f;\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\n\t\tconst orderBy =\n\t\t\twindowExpr.orderBy.length > 0\n\t\t\t\t? windowExpr.orderBy.map((o) => {\n\t\t\t\t\t\tconst f =\n\t\t\t\t\t\t\texpressionToField(o.expression) ?? expressionToSql(o.expression);\n\t\t\t\t\t\tif (ctx.currentFromTable && !f.includes('.') && !f.includes('(')) {\n\t\t\t\t\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, f);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { field: f, direction: o.direction };\n\t\t\t\t\t})\n\t\t\t\t: undefined;\n\n\t\treturn {\n\t\t\tkind: 'window',\n\t\t\tfunction: fn,\n\t\t\t...(field !== undefined && { field }),\n\t\t\talias: exprItem.alias ?? fn,\n\t\t\t...(offset !== undefined && { offset }),\n\t\t\t...(defaultValue !== undefined && { defaultValue }),\n\t\t\tover: {\n\t\t\t\t...(partitionBy && { partitionBy }),\n\t\t\t\t...(orderBy && { orderBy }),\n\t\t\t},\n\t\t};\n\t}\n\n\t// Subquery in SELECT (scalar subquery)\n\tif (expr.type === 'subquery') {\n\t\treturn {\n\t\t\tkind: 'subquery',\n\t\t\tquery: fns.compileQuery(expr.query, ctx) as QueryIntent,\n\t\t\t...(exprItem.alias !== undefined && { as: exprItem.alias }),\n\t\t};\n\t}\n\n\t// Simple path expression (single segment, e.g., \"name\")\n\tif (expr.type === 'path' && expr.segments.length === 1) {\n\t\tconst column = expr.segments[0]!;\n\t\tif (ctx.currentFromTable) {\n\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, column);\n\t\t}\n\t\tif (exprItem.alias) {\n\t\t\treturn { kind: 'columnAlias', column, alias: exprItem.alias };\n\t\t}\n\t\treturn { kind: 'column', column };\n\t}\n\n\t// Path expression with multiple segments\n\tif (expr.type === 'path' && expr.segments.length > 1) {\n\t\treturn compileMultiSegmentPath(expr, exprItem, ctx);\n\t}\n\n\t// Binary arithmetic expression\n\tif (\n\t\texpr.type === 'binary' &&\n\t\t['+', '-', '*', '/', '%'].includes(expr.operator)\n\t) {\n\t\tconst leftField = expressionToField(expr.left);\n\t\tconst rightField = expressionToField(expr.right);\n\t\treturn {\n\t\t\tkind: 'arithmetic',\n\t\t\tleft: leftField ?? expressionToValue(expr.left),\n\t\t\toperator: expr.operator as '+' | '-' | '*' | '/' | '%',\n\t\t\tright: rightField ?? expressionToValue(expr.right),\n\t\t\t...(exprItem.alias !== undefined && { as: exprItem.alias }),\n\t\t};\n\t}\n\n\t// Unary minus expression\n\tif (expr.type === 'unary') {\n\t\tconst unary = expr as NqlUnaryExpression;\n\t\tif (unary.operator === '-') {\n\t\t\tconst operandField = expressionToField(unary.operand);\n\t\t\treturn {\n\t\t\t\tkind: 'arithmetic',\n\t\t\t\tleft: -1,\n\t\t\t\toperator: '*',\n\t\t\t\tright: operandField ?? expressionToValue(unary.operand),\n\t\t\t\t...(exprItem.alias !== undefined && { as: exprItem.alias }),\n\t\t\t};\n\t\t}\n\t\tthrow new Error(`Unsupported unary operator in SELECT: ${unary.operator}`);\n\t}\n\n\t// CASE expression\n\tif (expr.type === 'case') {\n\t\treturn compileCaseExpression(expr as NqlCaseExpression, exprItem, ctx, fns);\n\t}\n\n\t// JSON access expression: data->'key'->>'nested' as alias\n\tif (expr.type === 'jsonAccess') {\n\t\tconst baseField = expressionToField(expr.base);\n\t\t/* v8 ignore start — defensive: jsonAccess base is always a path expression -- @preserve */\n\t\tif (!baseField) {\n\t\t\tthrow new Error('JSON access base must be a field reference');\n\t\t}\n\t\t/* v8 ignore stop -- @preserve */\n\t\treturn {\n\t\t\tkind: 'jsonExtract',\n\t\t\tfield: baseField,\n\t\t\tpath: expr.path,\n\t\t\tmode: expr.mode,\n\t\t\t...(exprItem.alias !== undefined && { as: exprItem.alias }),\n\t\t};\n\t}\n\n\t/* v8 ignore start — defensive: all parser-produced SELECT expression types are handled above -- @preserve */\n\tthrow new Error(\n\t\t`Unsupported expression type in SELECT: ${expr.type}. ` +\n\t\t\t`This expression cannot be compiled to IntentAST. ` +\n\t\t\t`Consider extending the grammar or using a supported expression.`,\n\t);\n\t/* v8 ignore stop -- @preserve */\n}\n\n/**\n * Compile a multi-segment path expression in SELECT context.\n */\nfunction compileMultiSegmentPath(\n\texpr: NqlPathExpression,\n\titem: NqlSelectExpression,\n\tctx: CompilerContext,\n): ExpressionIntent {\n\tconst segments = expr.segments;\n\tconst firstSegmentLower = (segments[0] as string).toLowerCase();\n\n\t// Check for pseudo-column traversal\n\tif (ctx.pseudoColumnKeywords.has(firstSegmentLower)) {\n\t\tconst firstSegment: string = firstSegmentLower;\n\t\tconst depthHint = expr.depthHint;\n\n\t\tif (depthHint !== undefined) {\n\t\t\tif (!ctx.recursiveKeywords.has(firstSegment)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Scoped depth [${depthHint}] is not supported on '${firstSegment}'. ` +\n\t\t\t\t\t\t`Only recursive traversals support depth hints.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore start — defensive: parser produces valid finite integers for depth hints -- @preserve */\n\t\t\tif (!Number.isFinite(depthHint) || depthHint < 1 || depthHint > 100) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Invalid depth hint [${depthHint}]: must be an integer between 1 and 100.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\t/* v8 ignore stop -- @preserve */\n\t\t}\n\n\t\tconst traversals: string[] = [firstSegment];\n\t\tlet i = 1;\n\t\twhile (\n\t\t\ti < segments.length &&\n\t\t\tctx.pseudoColumnKeywords.has((segments[i] as string).toLowerCase())\n\t\t) {\n\t\t\ttraversals.push((segments[i] as string).toLowerCase());\n\t\t\ti++;\n\t\t}\n\n\t\t/* v8 ignore start — defensive: parser always produces at least one column segment after traversals -- @preserve */\n\t\tif (i >= segments.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`Pseudo-column path must end with a column name: ${segments.join('.')}`,\n\t\t\t);\n\t\t}\n\t\t/* v8 ignore stop -- @preserve */\n\t\tconst targetColumn = segments[i]!;\n\t\tif (ctx.currentFromTable) {\n\t\t\tctx.validator?.validateColumn(ctx.currentFromTable, targetColumn);\n\t\t}\n\t\tconst defaultAlias = segments.map((s) => s.toLowerCase()).join('.');\n\n\t\tif (traversals.length === 1) {\n\t\t\treturn {\n\t\t\t\tkind: 'pseudoColumn',\n\t\t\t\ttraversal: firstSegment as PseudoColumnTraversal,\n\t\t\t\ttargetColumn,\n\t\t\t\tas: item.alias ?? defaultAlias,\n\t\t\t\t...(depthHint !== undefined && { depth: depthHint }),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tkind: 'pseudoColumn',\n\t\t\ttraversal: traversals[0]! as PseudoColumnTraversal,\n\t\t\ttraversals: traversals as PseudoColumnTraversal[],\n\t\t\ttargetColumn,\n\t\t\tas: item.alias ?? defaultAlias,\n\t\t};\n\t}\n\n\t// Regular relation path (e.g., customer.name)\n\tconst column = segments[segments.length - 1]!;\n\tconst relation = segments.slice(0, -1).join('.');\n\tif (ctx.currentFromTable && ctx.validator) {\n\t\tconst targetTable = ctx.validator.resolveRelationTarget(\n\t\t\tctx.currentFromTable,\n\t\t\tsegments[0]!,\n\t\t);\n\t\tif (targetTable) {\n\t\t\tctx.validator.validateColumn(targetTable, column);\n\t\t}\n\t}\n\treturn {\n\t\tkind: 'relationColumn',\n\t\trelation,\n\t\tcolumn,\n\t\tas: item.alias ?? `${relation}.${column}`,\n\t};\n}\n\n/**\n * Compile a CASE expression in SELECT context.\n */\nfunction compileCaseExpression(\n\tcaseExpr: NqlCaseExpression,\n\titem: NqlSelectExpression,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n): ExpressionIntent {\n\tif (caseExpr.subject) {\n\t\t// Simple CASE: normalize to searched CASE\n\t\tconst subjectField = expressionToField(caseExpr.subject);\n\t\t/* v8 ignore start — defensive: simple CASE subject is always a path expression -- @preserve */\n\t\tif (!subjectField) {\n\t\t\tthrow new Error('Simple CASE subject must be a column reference');\n\t\t}\n\t\t/* v8 ignore stop -- @preserve */\n\t\treturn {\n\t\t\tkind: 'case' as const,\n\t\t\twhen: caseExpr.whenClauses.map((wc) => ({\n\t\t\t\tcondition: {\n\t\t\t\t\tkind: 'comparison' as const,\n\t\t\t\t\tfield: subjectField,\n\t\t\t\t\toperator: 'eq',\n\t\t\t\t\tvalue: expressionToValue(wc.condition),\n\t\t\t\t},\n\t\t\t\tresult: compileExpressionToIntent(wc.result, ctx, fns),\n\t\t\t})),\n\t\t\t...(caseExpr.elseClause && {\n\t\t\t\telse: compileExpressionToIntent(caseExpr.elseClause, ctx, fns),\n\t\t\t}),\n\t\t\t...(item.alias !== undefined && { as: item.alias }),\n\t\t};\n\t}\n\n\t// Searched CASE: CASE WHEN boolExpr THEN expr ...\n\treturn {\n\t\tkind: 'case' as const,\n\t\twhen: caseExpr.whenClauses.map((wc) => ({\n\t\t\tcondition: fns.compileExpression(wc.condition, ctx, fns),\n\t\t\tresult: compileExpressionToIntent(wc.result, ctx, fns),\n\t\t})),\n\t\t...(caseExpr.elseClause && {\n\t\t\telse: compileExpressionToIntent(caseExpr.elseClause, ctx, fns),\n\t\t}),\n\t\t...(item.alias !== undefined && { as: item.alias }),\n\t};\n}\n\n/**\n * Compile an NqlExpression to ExpressionIntent for use in CASE results.\n */\nfunction compileExpressionToIntent(\n\texpr: NqlExpression,\n\tctx: CompilerContext,\n\tfns: CompilerFns,\n): ExpressionIntent {\n\t// Handle comparison expressions\n\tif (expr.type === 'comparison') {\n\t\tconst cmp = expr as NqlComparisonExpression;\n\t\t/* v8 ignore start — defensive: CASE conditions always have path on LHS from parser -- @preserve */\n\t\tif (cmp.left.type !== 'path') {\n\t\t\tthrow new Error(\n\t\t\t\t`CASE WHEN condition left side must be a column path, got ${cmp.left.type}`,\n\t\t\t);\n\t\t}\n\t\t/* v8 ignore stop -- @preserve */\n\t\tconst column = (cmp.left as NqlPathExpression).segments.join('.');\n\t\tconst value = expressionToValue(cmp.right);\n\t\treturn {\n\t\t\tkind: 'comparison',\n\t\t\tcolumn,\n\t\t\toperator: cmp.operator,\n\t\t\tvalue,\n\t\t};\n\t}\n\n\t// Handle literal values\n\tif (\n\t\texpr.type === 'string' ||\n\t\texpr.type === 'number' ||\n\t\texpr.type === 'boolean' ||\n\t\texpr.type === 'null'\n\t) {\n\t\tconst value =\n\t\t\texpr.type === 'null'\n\t\t\t\t? null\n\t\t\t\t: (expr as NqlStringLiteral | NqlNumberLiteral | NqlBooleanLiteral)\n\t\t\t\t\t\t.value;\n\t\treturn {\n\t\t\tkind: 'literal',\n\t\t\tvalue,\n\t\t};\n\t}\n\n\t// For other expressions, wrap and use compileSelectExpression\n\tconst selectItem: NqlSelectItem = {\n\t\ttype: 'expression',\n\t\texpression: expr,\n\t};\n\treturn compileSelectExpression(selectItem, ctx, fns);\n}\n\n// ============================================================================\n// JSON Function Notation → Same intents as operator notation\n// ============================================================================\n\nconst JSON_FUNCTION_NAMES: ReadonlySet<string> = new Set([\n\t'json_extract',\n\t'json_extract_text',\n\t'json_path',\n\t'json_path_text',\n]);\n\n/**\n * Compile JSON function notation to the same intent as operator notation.\n * Returns null if the function is not a known JSON function.\n */\nfunction compileJsonFunction(\n\tfn: string,\n\targs: NqlExpression[],\n\talias: string | undefined,\n): ExpressionIntent | null {\n\tif (!JSON_FUNCTION_NAMES.has(fn)) return null;\n\n\tif (args.length < 2) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t`${fn}() requires at least 2 arguments: field and key`,\n\t\t);\n\t}\n\n\tconst field = expressionToField(args[0]!);\n\t/* v8 ignore start — defensive: first arg is always a field reference -- @preserve */\n\tif (!field) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t`${fn}() first argument must be a field reference`,\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\tif (fn === 'json_extract' || fn === 'json_extract_text') {\n\t\t// json_extract(col, 'key') → JsonExtractIntent\n\t\t// M-1: String(expressionToValue(a)) → '[object Object]' for path expressions.\n\t\t// coerceToStringKey prevents silent coercion: single-segment identifiers are\n\t\t// treated as string keys; dotted paths and non-string args throw SEM_INVALID_SYNTAX.\n\t\tconst keys = args\n\t\t\t.slice(1)\n\t\t\t.map((a) => coerceToStringKey(a, `${fn}() path argument`));\n\t\treturn {\n\t\t\tkind: 'jsonExtract',\n\t\t\tfield,\n\t\t\tpath: keys,\n\t\t\tmode: fn === 'json_extract' ? 'json' : 'text',\n\t\t\t...(alias !== undefined && { as: alias }),\n\t\t};\n\t}\n\n\tif (fn === 'json_path' || fn === 'json_path_text') {\n\t\t// json_path(col, 'a', 'b') → JsonPathExtractIntent with array literal '{a,b}'\n\t\t// Also supports pre-built literal: json_path(col, '{a,b}')\n\t\t// M-1: same coercion fix — reject path expressions and non-string args.\n\t\tconst keys = args\n\t\t\t.slice(1)\n\t\t\t.map((a) => coerceToStringKey(a, `${fn}() path argument`));\n\t\tconst first = keys[0];\n\t\tconst pathStr =\n\t\t\tkeys.length === 1 && first?.startsWith('{') && first.endsWith('}')\n\t\t\t\t? first\n\t\t\t\t: `{${keys.join(',')}}`;\n\t\treturn {\n\t\t\tkind: 'jsonPathExtract',\n\t\t\tfield,\n\t\t\tpath: pathStr,\n\t\t\tmode: fn === 'json_path' ? 'json' : 'text',\n\t\t\t...(alias !== undefined && { as: alias }),\n\t\t};\n\t}\n\n\treturn null;\n}\n","/**\n * @module compiler/types\n * Shared types, interfaces, and constants for the NQL compiler.\n */\n\nimport type {\n\tCteQueryIntent,\n\tMutationIntent,\n\tQueryIntent,\n\tSetOperationIntent,\n\tWhereIntent,\n} from '@dbsp/types';\nimport type { NqlExpression } from '../parser/ast.js';\nimport type { ColumnValidator } from './column-validator.js';\n\nexport interface CompileResult {\n\treadonly query?: QueryIntent;\n\t/** CTE query (WITH clause): wraps outer QueryIntent in CteQueryIntent */\n\treadonly cteQuery?: CteQueryIntent;\n\treadonly mutation?: MutationIntent;\n\treadonly returning?: readonly string[];\n\t/** Named bindings from `| bind X` clauses (CTE source queries) */\n\treadonly bindings?: ReadonlyMap<string, QueryIntent>;\n\t/**\n\t * Named mutation bindings from `mutation | select cols | bind X` clauses.\n\t * When a mutation has RETURNING and is bound, the original MutationIntent is stored here\n\t * so the adapter can compile it as a CTE: `WITH X AS (INSERT ... RETURNING cols) ...`\n\t * The corresponding synthetic QueryIntent is also stored in `bindings` for reference resolution.\n\t */\n\treadonly mutationBindings?: ReadonlyMap<string, MutationIntent>;\n\t/** Set operation (UNION/INTERSECT/EXCEPT) wrapping two queries */\n\treadonly setOperation?: SetOperationIntent;\n}\n\n/**\n * Duck-type interface for schema-based column validation.\n * Loose coupling: ModelIR from @dbsp/core satisfies this shape without direct import.\n */\nexport interface ColumnValidatorSchema {\n\tgetTable(name: string):\n\t\t| {\n\t\t\t\treadonly columns: readonly { readonly name: string }[];\n\t\t\t\treadonly pseudoColumns?: readonly {\n\t\t\t\t\treadonly parentRole: string;\n\t\t\t\t\treadonly childRole: string;\n\t\t\t\t}[];\n\t\t }\n\t\t| undefined;\n\tgetRelationsFrom(\n\t\tsourceTable: string,\n\t): readonly { readonly name: string; readonly target: string }[];\n}\n\n/**\n * Options for the NQL compiler.\n * Allows dynamic pseudo-column keywords from schema configuration.\n */\nexport interface NqlCompilerOptions {\n\treadonly pseudoColumnKeywords?: readonly string[];\n\treadonly recursiveKeywords?: readonly string[];\n\t/** BATCH-001: Named parameters for ANY(:param) expressions */\n\treadonly params?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Mutable compilation context carried through all compiler functions.\n * Holds shared state that changes during compilation of a single statement.\n */\nexport interface CompilerContext {\n\tcurrentFromTable: string | undefined;\n\tcurrentRelationTarget: string | undefined;\n\treadonly pseudoColumnKeywords: ReadonlySet<string>;\n\treadonly recursiveKeywords: ReadonlySet<string>;\n\treadonly validator: ColumnValidator | null;\n\t/** BATCH-001: Named parameters for ANY(:param) expressions */\n\treadonly params: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Cross-module function references to break circular import cycles.\n * compile-query ↔ compile-select ↔ compile-expression need each other.\n */\nexport interface CompilerFns {\n\tcompileQuery: (\n\t\tquery: import('../parser/ast.js').NqlQuery,\n\t\tctx: CompilerContext,\n\t) => QueryIntent | SetOperationIntent;\n\tcompileSelectClause: (\n\t\tclause: import('../parser/ast.js').NqlSelectClause,\n\t\tctx: CompilerContext,\n\t\tfns: CompilerFns,\n\t) => import('@dbsp/types').SelectIntent;\n\tcompileExpression: (\n\t\texpr: NqlExpression,\n\t\tctx: CompilerContext,\n\t\tfns: CompilerFns,\n\t\taliasContext?: string,\n\t\touterAliases?: string[],\n\t) => WhereIntent;\n}\n\n/**\n * Default pseudo-column keywords for self-referential traversal.\n */\nexport const DEFAULT_PSEUDO_COLUMN_KEYWORDS: readonly string[] = [\n\t'parent',\n\t'child',\n\t'ascendant',\n\t'descendant',\n];\n\n/**\n * Default recursive keywords that support scoped depth syntax [N].\n */\nexport const DEFAULT_RECURSIVE_KEYWORDS: readonly string[] = [\n\t'ascendant',\n\t'descendant',\n];\n","/* biome-ignore-all lint/style/noNonNullAssertion: NQL AST node access requires non-null assertions on validated parse tree */\n/**\n * NQL Compiler\n *\n * Transforms NQL AST to IntentAST.\n * Thin coordinator: delegates to domain modules for actual compilation.\n *\n * @since ARCH-007: IntentAST types centralized in @dbsp/types to avoid circular dependencies.\n */\n\n// IntentAST types from @dbsp/types (canonical source) — re-export for backward compatibility\nexport type {\n\tAggregateFunction,\n\tComparisonOperator,\n\tCteQueryIntent,\n\tDeleteIntent,\n\tExpressionIntent,\n\tIncludeIntent,\n\tInsertFromIntent,\n\tInsertIntent,\n\tMutationIntent,\n\tNullOperator,\n\tOrderByIntent,\n\tPseudoColumnTraversal,\n\tQueryIntent,\n\tRangeOperator,\n\tSelectAllIntent,\n\tSelectFieldsIntent,\n\tSelectIntent,\n\tSelectWithExpressionsIntent,\n\tSetOperationIntent,\n\tSetOperationType,\n\tSimpleCteIntent,\n\tSortDirection,\n\tUpdateIntent,\n\tUpsertConflictAction,\n\tUpsertConflictTarget,\n\tUpsertFromIntent,\n\tUpsertIntent,\n\tWhereAndIntent,\n\tWhereComparisonIntent,\n\tWhereInIntent,\n\tWhereIntent,\n\tWhereLikeIntent,\n\tWhereNotIntent,\n\tWhereNullIntent,\n\tWhereOrIntent,\n\tWhereRangeIntent,\n\tWhereRelationFilterIntent,\n\tWindowFunction,\n\tWindowOrderBy,\n} from '@dbsp/types';\n\nimport type {\n\tMutationIntent,\n\tQueryIntent,\n\tSetOperationIntent,\n} from '@dbsp/types';\nimport type {\n\tNqlMutationPipeline,\n\tNqlProgram,\n\tNqlQuery,\n\tNqlSelectClause,\n\tNqlStatement,\n\tNqlWithQuery,\n} from '../parser/ast.js';\n\n// Domain modules\nimport { ColumnValidator } from './column-validator.js';\nimport { compileWithQuery } from './compile-cte.js';\nimport { compileExpression } from './compile-expression.js';\nimport {\n\tcompileMutationPipeline,\n\textractBindName,\n} from './compile-mutation.js';\nimport { compileQuery } from './compile-query.js';\nimport { compileSelectClause } from './compile-select.js';\n\n// Re-export public types\nexport type {\n\tColumnValidatorSchema,\n\tCompileResult,\n\tNqlCompilerOptions,\n} from './types.js';\nexport {\n\tDEFAULT_PSEUDO_COLUMN_KEYWORDS,\n\tDEFAULT_RECURSIVE_KEYWORDS,\n} from './types.js';\n\nimport type {\n\tColumnValidatorSchema,\n\tCompileResult,\n\tCompilerContext,\n\tCompilerFns,\n\tNqlCompilerOptions,\n} from './types.js';\nimport {\n\tDEFAULT_PSEUDO_COLUMN_KEYWORDS,\n\tDEFAULT_RECURSIVE_KEYWORDS,\n} from './types.js';\n\n/**\n * Compiler that transforms NQL AST to IntentAST.\n * Thin coordinator: holds context, wires domain modules via CompilerFns.\n */\nexport class NqlCompiler {\n\tprivate readonly ctx: CompilerContext;\n\tprivate readonly fns: CompilerFns;\n\n\tconstructor(options?: NqlCompilerOptions, schema?: ColumnValidatorSchema) {\n\t\tconst keywords =\n\t\t\toptions?.pseudoColumnKeywords ?? DEFAULT_PSEUDO_COLUMN_KEYWORDS;\n\t\tconst pseudoColumnKeywords = new Set(keywords.map((k) => k.toLowerCase()));\n\t\tconst recursive = options?.recursiveKeywords ?? DEFAULT_RECURSIVE_KEYWORDS;\n\t\tconst recursiveKeywords = new Set(recursive.map((k) => k.toLowerCase()));\n\t\tconst validator = schema ? new ColumnValidator(schema) : null;\n\n\t\tthis.ctx = {\n\t\t\tcurrentFromTable: undefined,\n\t\t\tcurrentRelationTarget: undefined,\n\t\t\tpseudoColumnKeywords,\n\t\t\trecursiveKeywords,\n\t\t\tvalidator,\n\t\t\tparams: options?.params ?? {},\n\t\t};\n\n\t\t// Wire up cross-module function references\n\t\tthis.fns = {\n\t\t\tcompileQuery: (query: NqlQuery, ctx: CompilerContext) =>\n\t\t\t\tcompileQuery(query, ctx, this.fns),\n\t\t\tcompileSelectClause: (\n\t\t\t\tclause: NqlSelectClause,\n\t\t\t\tctx: CompilerContext,\n\t\t\t\tfns: CompilerFns,\n\t\t\t) => compileSelectClause(clause, ctx, fns),\n\t\t\tcompileExpression: (...args) => compileExpression(...args),\n\t\t};\n\t}\n\n\t/**\n\t * Compile an NQL program to IntentAST.\n\t */\n\tcompile(program: NqlProgram): CompileResult {\n\t\tif (program.statements.length === 0) {\n\t\t\treturn {};\n\t\t}\n\n\t\tif (program.statements.length === 1) {\n\t\t\treturn this.compileSingleStatement(program.statements[0]!);\n\t\t}\n\n\t\t// Multi-statement: build bindings map, resolve references\n\t\tconst bindings = new Map<string, QueryIntent>();\n\t\tconst mutationBindings = new Map<string, MutationIntent>();\n\t\tlet lastResult: CompileResult = {};\n\n\t\tfor (const stmt of program.statements) {\n\t\t\tlastResult = this.compileSingleStatement(stmt, bindings);\n\n\t\t\tconst bindName = extractBindName(stmt);\n\t\t\tif (bindName) {\n\t\t\t\tif (lastResult.query) {\n\t\t\t\t\tbindings.set(bindName, lastResult.query);\n\t\t\t\t} else if (lastResult.mutation?.returning?.length) {\n\t\t\t\t\t// Mutation with RETURNING: store the original mutation for CTE compilation\n\t\t\t\t\t// and a synthetic QueryIntent for reference resolution in WHERE clauses\n\t\t\t\t\tmutationBindings.set(bindName, lastResult.mutation);\n\t\t\t\t\tbindings.set(bindName, {\n\t\t\t\t\t\ttype: 'select',\n\t\t\t\t\t\tfrom: lastResult.mutation.table,\n\t\t\t\t\t\tselect: {\n\t\t\t\t\t\t\ttype: 'fields',\n\t\t\t\t\t\t\tfields: [...lastResult.mutation.returning],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Note: set operations cannot currently be bound as CTE sources\n\t\t\t\t// Note: mutations without RETURNING cannot be bound (no output to reference)\n\t\t\t}\n\t\t}\n\n\t\tconst hasMutationBindings = mutationBindings.size > 0;\n\t\tif (bindings.size > 0) {\n\t\t\treturn {\n\t\t\t\t...lastResult,\n\t\t\t\tbindings,\n\t\t\t\t...(hasMutationBindings && { mutationBindings }),\n\t\t\t};\n\t\t}\n\t\treturn lastResult;\n\t}\n\n\tprivate compileSingleStatement(\n\t\tstmt: NqlStatement,\n\t\tbindings?: Map<string, QueryIntent>,\n\t): CompileResult {\n\t\tif (stmt.type === 'withQuery') {\n\t\t\treturn compileWithQuery(stmt as NqlWithQuery, this.ctx, this.fns);\n\t\t}\n\t\tif (stmt.type === 'query') {\n\t\t\tconst result = compileQuery(stmt, this.ctx, this.fns, bindings);\n\t\t\tif ('kind' in result && result.kind === 'setOperation') {\n\t\t\t\treturn { setOperation: result as SetOperationIntent };\n\t\t\t}\n\t\t\treturn { query: result as QueryIntent };\n\t\t}\n\t\tif (stmt.type === 'mutationPipeline') {\n\t\t\tconst result = compileMutationPipeline(\n\t\t\t\tstmt as NqlMutationPipeline,\n\t\t\t\tthis.ctx,\n\t\t\t\tthis.fns,\n\t\t\t\tbindings,\n\t\t\t);\n\t\t\tif (result.returning) {\n\t\t\t\treturn {\n\t\t\t\t\tmutation: {\n\t\t\t\t\t\t...result.mutation,\n\t\t\t\t\t\treturning: result.returning,\n\t\t\t\t\t} as MutationIntent,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn { mutation: result.mutation };\n\t\t}\n\t\t/* v8 ignore next — defensive: parser only produces query or mutationPipeline -- @preserve */\n\t\treturn {};\n\t}\n}\n\n/**\n * Create a compiler instance.\n */\nexport function createCompiler(\n\toptions?: NqlCompilerOptions,\n\tschema?: ColumnValidatorSchema,\n): NqlCompiler {\n\treturn new NqlCompiler(options, schema);\n}\n","import { createToken, Lexer } from 'chevrotain';\n\n// ============================================================\n// WHITESPACE & COMMENTS\n// ============================================================\n\nexport const WhiteSpace = createToken({\n\tname: 'WhiteSpace',\n\tpattern: /\\s+/,\n\tgroup: Lexer.SKIPPED,\n});\n\nexport const LineComment = createToken({\n\tname: 'LineComment',\n\tpattern: /#[^\\n\\r]*/,\n\tgroup: Lexer.SKIPPED,\n});\n\n// ============================================================\n// KEYWORDS - Use word boundaries (\\b) to prevent matching prefixes of identifiers\n// ============================================================\n\n// Query keywords\nexport const With = createToken({ name: 'With', pattern: /with\\b/i });\nexport const Select = createToken({ name: 'Select', pattern: /select\\b/i });\nexport const Where = createToken({ name: 'Where', pattern: /where\\b/i });\nexport const Flat = createToken({ name: 'Flat', pattern: /flat\\b/i });\nexport const Via = createToken({ name: 'Via', pattern: /via\\b/i });\nexport const Bind = createToken({ name: 'Bind', pattern: /bind\\b/i });\nexport const GroupBy = createToken({\n\tname: 'GroupBy',\n\tpattern: /group\\s+by\\b/i,\n});\nexport const OrderBy = createToken({\n\tname: 'OrderBy',\n\tpattern: /order\\s+by\\b/i,\n});\nexport const PartitionBy = createToken({\n\tname: 'PartitionBy',\n\tpattern: /partition\\s+by\\b/i,\n});\nexport const Limit = createToken({ name: 'Limit', pattern: /limit\\b/i });\nexport const Offset = createToken({ name: 'Offset', pattern: /offset\\b/i });\nexport const Distinct = createToken({\n\tname: 'Distinct',\n\tpattern: /distinct\\b/i,\n});\n// Asc/As: Asc must come before As in allTokens array since 'as' is prefix of 'asc'\nexport const Asc = createToken({ name: 'Asc', pattern: /asc\\b/i });\nexport const As = createToken({ name: 'As', pattern: /as\\b/i });\nexport const On = createToken({ name: 'On', pattern: /on\\b/i });\n\n// Boolean operators\nexport const And = createToken({ name: 'And', pattern: /and\\b/i });\nexport const Or = createToken({ name: 'Or', pattern: /or\\b/i });\nexport const Not = createToken({ name: 'Not', pattern: /not\\b/i });\n\n// SPEC-002: Quantifiers for relation filtering\nexport const All = createToken({ name: 'All', pattern: /all\\b/i });\nexport const Some = createToken({ name: 'Some', pattern: /some\\b/i });\nexport const None = createToken({ name: 'None', pattern: /none\\b/i });\nexport const Every = createToken({ name: 'Every', pattern: /every\\b/i });\n\n// Comparison operators (keyword-based)\n// Insert/Into must come before In in allTokens array since 'in' is prefix\nexport const Insert = createToken({ name: 'Insert', pattern: /insert\\b/i });\nexport const Into = createToken({ name: 'Into', pattern: /into\\b/i });\nexport const In = createToken({ name: 'In', pattern: /in\\b/i });\n// BATCH-001: ANY operator keyword (for col = ANY(:param) syntax)\n// longer_alt: Identifier ensures ANY(identifier) isn't consumed as keyword when used as identifier\nexport const Any = createToken({ name: 'Any', pattern: /ANY\\b/i });\n// BATCH-001: Named parameter token — :paramName (used in ANY(:param))\nexport const NamedParam = createToken({\n\tname: 'NamedParam',\n\tpattern: /:[a-zA-Z_][a-zA-Z0-9_]*/,\n});\nexport const Between = createToken({ name: 'Between', pattern: /between\\b/i });\nexport const Like = createToken({ name: 'Like', pattern: /like\\b/i });\n\n// Range operators (PostgreSQL)\nexport const Overlaps = createToken({\n\tname: 'Overlaps',\n\tpattern: /overlaps\\b/i,\n});\nexport const Contains = createToken({\n\tname: 'Contains',\n\tpattern: /contains\\b/i,\n});\nexport const ContainedBy = createToken({\n\tname: 'ContainedBy',\n\tpattern: /containedBy\\b/i,\n});\n\n// Range literal tokens (grammar-based approach)\n// Ranges start with [ which is unambiguous in NQL (not used elsewhere)\n// This avoids conflicts with identifier lists like (col1, col2) in UPSERT ON clause\nexport const LBracket = createToken({ name: 'LBracket', pattern: /\\[/ });\nexport const RBracket = createToken({ name: 'RBracket', pattern: /\\]/ });\n\n// Range value: matches date/time patterns inside range brackets\n// Pattern: digits followed by at least one separator group (-/:T followed by digits)\n// Examples: 2024-01-01, 08:00, 2024-01-01T08:00:00\n// NOTE: Decimals like 10.5 use NumberLiteral (handled by rangeValue grammar rule)\n// Must come BEFORE NumberLiteral in allTokens to match date patterns first\nexport const RangeValue = createToken({\n\tname: 'RangeValue',\n\tpattern: /(?:\\d{4}(?:[-:T]\\d{1,2})+|\\d{2}:\\d{2}(?::\\d{2})?)/,\n});\nexport const Is = createToken({ name: 'Is', pattern: /is\\b/i });\nexport const Exists = createToken({ name: 'Exists', pattern: /exists\\b/i });\n\n// Mutation keywords\nexport const Update = createToken({ name: 'Update', pattern: /update\\b/i });\nexport const Delete = createToken({ name: 'Delete', pattern: /delete\\b/i });\nexport const From = createToken({ name: 'From', pattern: /from\\b/i });\nexport const SetKeyword = createToken({ name: 'Set', pattern: /set\\b/i });\nexport const Upsert = createToken({ name: 'Upsert', pattern: /upsert\\b/i });\nexport const Values = createToken({ name: 'Values', pattern: /values\\b/i });\n\n// Literals\nexport const True = createToken({ name: 'True', pattern: /true\\b/i });\nexport const False = createToken({ name: 'False', pattern: /false\\b/i });\nexport const Null = createToken({ name: 'Null', pattern: /null\\b/i });\n\n// Sort direction\nexport const Desc = createToken({ name: 'Desc', pattern: /desc\\b/i });\n\n// Window functions\nexport const Over = createToken({ name: 'Over', pattern: /over\\b/i });\nexport const RowNumber = createToken({\n\tname: 'RowNumber',\n\tpattern: /row_number\\b/i,\n});\nexport const Rank = createToken({ name: 'Rank', pattern: /rank\\b/i });\nexport const DenseRank = createToken({\n\tname: 'DenseRank',\n\tpattern: /dense_rank\\b/i,\n});\nexport const Lag = createToken({ name: 'Lag', pattern: /lag\\b/i });\nexport const Lead = createToken({ name: 'Lead', pattern: /lead\\b/i });\n\n// CASE expression keywords\nexport const Case = createToken({ name: 'Case', pattern: /case\\b/i });\nexport const When = createToken({ name: 'When', pattern: /when\\b/i });\nexport const Then = createToken({ name: 'Then', pattern: /then\\b/i });\nexport const Else = createToken({ name: 'Else', pattern: /else\\b/i });\nexport const End = createToken({ name: 'End', pattern: /end\\b/i });\n\n// Set operations\nexport const Union = createToken({ name: 'Union', pattern: /union\\b/i });\n// Intersect must come before In/Into in allTokens since 'in' is prefix\nexport const Intersect = createToken({\n\tname: 'Intersect',\n\tpattern: /intersect\\b/i,\n});\nexport const Except = createToken({ name: 'Except', pattern: /except\\b/i });\n\n// Lock clause keywords (E15)\n// Multi-word tokens — must come before single-word keywords in allTokens\nexport const ForNoKeyUpdate = createToken({\n\tname: 'ForNoKeyUpdate',\n\tpattern: /for\\s+no\\s+key\\s+update\\b/i,\n});\nexport const ForKeyShare = createToken({\n\tname: 'ForKeyShare',\n\tpattern: /for\\s+key\\s+share\\b/i,\n});\nexport const ForUpdate = createToken({\n\tname: 'ForUpdate',\n\tpattern: /for\\s+update\\b/i,\n});\nexport const ForShare = createToken({\n\tname: 'ForShare',\n\tpattern: /for\\s+share\\b/i,\n});\nexport const SkipLocked = createToken({\n\tname: 'SkipLocked',\n\tpattern: /skip\\s+locked\\b/i,\n});\nexport const NoWait = createToken({ name: 'NoWait', pattern: /nowait\\b/i });\n\n// ============================================================\n// PSEUDO-COLUMN KEYWORDS (Self-Referential Traversal)\n// ============================================================\n\n// Single-hop traversal\nexport const Parent = createToken({ name: 'Parent', pattern: /parent\\b/i });\nexport const Child = createToken({ name: 'Child', pattern: /child\\b/i });\n\n// Recursive traversal (CTE-based)\n// Ascendant must come before Asc in allTokens since 'asc' is prefix\nexport const Ascendant = createToken({\n\tname: 'Ascendant',\n\tpattern: /ascendant\\b/i,\n});\nexport const Descendant = createToken({\n\tname: 'Descendant',\n\tpattern: /descendant\\b/i,\n});\n\n// ============================================================\n// IDENTIFIERS & LITERALS\n// ============================================================\n\nexport const Identifier = createToken({\n\tname: 'Identifier',\n\tpattern: /[a-zA-Z_][a-zA-Z0-9_]*/,\n});\n\nexport const QuotedIdentifier = createToken({\n\tname: 'QuotedIdentifier',\n\t// SQL-style: \"ident\" with \"\" for escaped quote\n\tpattern: /\"(?:[^\"]|\"\")*\"/,\n});\n\nexport const StringLiteral = createToken({\n\tname: 'StringLiteral',\n\t// SQL-style: 'string' with '' for escaped quote\n\tpattern: /'(?:[^']|'')*'/,\n});\n\nexport const NumberLiteral = createToken({\n\tname: 'NumberLiteral',\n\t// Note: No leading - sign. Negative numbers are parsed as unary minus + number\n\t// This matches SQL behavior where \"price-1\" is subtraction, not \"price\" followed by \"-1\"\n\tpattern: /\\d+(\\.\\d+)?/,\n});\n\n// ============================================================\n// OPERATORS & PUNCTUATION\n// ============================================================\n\nexport const Pipe = createToken({ name: 'Pipe', pattern: /\\|/ });\nexport const Comma = createToken({ name: 'Comma', pattern: /,/ });\nexport const Dot = createToken({ name: 'Dot', pattern: /\\./ });\nexport const Star = createToken({ name: 'Star', pattern: /\\*/ });\nexport const LParen = createToken({ name: 'LParen', pattern: /\\(/ });\nexport const RParen = createToken({ name: 'RParen', pattern: /\\)/ });\nexport const Colon = createToken({ name: 'Colon', pattern: /:/ });\n\n// Comparison operators\nexport const Equals = createToken({ name: 'Equals', pattern: /=/ });\nexport const NotEquals = createToken({ name: 'NotEquals', pattern: /!=|<>/ });\nexport const LessThanOrEqual = createToken({\n\tname: 'LessThanOrEqual',\n\tpattern: /<=/,\n});\nexport const GreaterThanOrEqual = createToken({\n\tname: 'GreaterThanOrEqual',\n\tpattern: />=/,\n});\nexport const LessThan = createToken({ name: 'LessThan', pattern: /</ });\nexport const GreaterThan = createToken({ name: 'GreaterThan', pattern: />/ });\n\n// Arithmetic operators\nexport const Plus = createToken({ name: 'Plus', pattern: /\\+/ });\nexport const Minus = createToken({ name: 'Minus', pattern: /-/ });\nexport const Slash = createToken({ name: 'Slash', pattern: /\\// });\nexport const Percent = createToken({ name: 'Percent', pattern: /%/ });\n\n// JSONB operators (E13)\nexport const JsonArrowText = createToken({\n\tname: 'JsonArrowText',\n\tpattern: /->>/,\n}); // ->> (extract text)\nexport const JsonArrow = createToken({\n\tname: 'JsonArrow',\n\tpattern: /->(?!>)/,\n}); // -> (extract JSON, NOT ->>)\nexport const JsonContainsOp = createToken({\n\tname: 'JsonContainsOp',\n\tpattern: /@>/,\n}); // @> (contains)\nexport const JsonContainedByOp = createToken({\n\tname: 'JsonContainedByOp',\n\tpattern: /<@/,\n}); // <@ (contained by)\nexport const JsonExistsOp = createToken({\n\tname: 'JsonExistsOp',\n\tpattern: /\\?/,\n}); // ? (key exists)\n// Note: #> and #>> (JSON path extract) conflict with NQL's # line comments.\n// Use function notation instead: json_path(col, '{a,b}'), json_path_text(col, '{a,b}')\n\n// ============================================================\n// TOKEN ORDER (Important for Chevrotain!)\n// Keywords must come before Identifier\n// ============================================================\n\nexport const allTokens = [\n\t// Whitespace & comments (skipped)\n\tWhiteSpace,\n\tLineComment,\n\n\t// Multi-word keywords (must come first)\n\tGroupBy,\n\tOrderBy,\n\tPartitionBy,\n\t// Lock clause multi-word tokens (E15)\n\tForNoKeyUpdate, // Must come before ForUpdate (longer match)\n\tForKeyShare, // Must come before ForShare (longer match)\n\tForUpdate,\n\tForShare,\n\tSkipLocked,\n\n\t// Keywords (before Identifier!)\n\t// IMPORTANT: Order matters for prefix conflicts!\n\t// - Insert/Into BEFORE In\n\t// - Ascendant/Descendant BEFORE Asc/Desc\n\t// - Asc BEFORE As\n\tWith, // Must come before Where (no prefix conflict) and before Identifier\n\tSelect,\n\tWhere,\n\tFlat,\n\tVia,\n\tBind,\n\tLimit,\n\tOffset,\n\tDistinct,\n\t// Pseudo-column keywords (self-referential traversal)\n\tAscendant, // Must come before Asc\n\tDescendant, // Must come before Desc\n\tParent,\n\tChild,\n\tAsc, // Must come before As\n\tAs,\n\tOn,\n\tAnd,\n\tOr,\n\tNot,\n\t// SPEC-002: Quantifiers (All must come before As prefix-wise, Every before Exists)\n\tAll,\n\tSome,\n\tNone,\n\tNoWait, // Lock wait policy (E15) — single word, no prefix conflict\n\tEvery,\n\tIntersect, // Must come before In/Into (in is prefix of intersect)\n\tInsert, // Must come before In\n\tInto, // Must come before In\n\tIn,\n\tAny, // BATCH-001: ANY keyword (after In — no prefix conflict with In)\n\tBetween,\n\tLike,\n\tOverlaps,\n\tContainedBy, // Must come before Contains (prefix)\n\tContains,\n\tIs,\n\tExists,\n\tUpdate,\n\tDelete,\n\tFrom,\n\tSetKeyword,\n\tUpsert,\n\tValues,\n\tTrue,\n\tFalse,\n\tNull,\n\tDesc,\n\tOver,\n\tRowNumber,\n\tDenseRank, // Must come before Rank (prefix)\n\tRank,\n\tLag,\n\tLead,\n\t// CASE expression keywords\n\tCase,\n\tWhen,\n\tThen,\n\tElse,\n\tEnd,\n\t// Set operations\n\tUnion,\n\tExcept,\n\n\t// Range values (date/time patterns - must come before NumberLiteral)\n\tRangeValue,\n\n\t// Identifiers & literals\n\tIdentifier,\n\tQuotedIdentifier,\n\tStringLiteral,\n\tNumberLiteral,\n\n\t// Multi-char operators (before single-char — longest match first!)\n\tJsonArrowText, // ->> before -> before -\n\tJsonArrow, // -> before -\n\tJsonContainsOp, // @> before >\n\tJsonContainedByOp, // <@ before <\n\tNotEquals,\n\tLessThanOrEqual,\n\tGreaterThanOrEqual,\n\n\t// Single-char operators & punctuation\n\tPipe,\n\tComma,\n\tDot,\n\tStar,\n\tLParen,\n\tRParen,\n\tLBracket,\n\tRBracket,\n\tNamedParam, // BATCH-001: :paramName — must come BEFORE Colon (longest match wins)\n\tColon,\n\tEquals,\n\tLessThan,\n\tGreaterThan,\n\tPlus,\n\tMinus,\n\tSlash,\n\tPercent,\n\tJsonExistsOp, // ? (no conflict with other tokens)\n];\n\n// Create the lexer instance\nexport const NqlLexer = new Lexer(allTokens);\n","/**\n * NQL v2.0 Parser Grammar (Chevrotain)\n *\n * Pipeline syntax for reads, SQL-familiar mutations.\n * See docs/plans/NQL-PARSER-AUDIT-2026-01.md Section 11 for EBNF.\n */\n\nimport { type CstNode, CstParser, type IToken } from 'chevrotain';\nimport {\n\tAll,\n\tAnd,\n\tAny,\n\tAs,\n\tAsc,\n\tAscendant,\n\tallTokens,\n\tBetween,\n\tBind,\n\tCase,\n\tChild,\n\tComma,\n\tContainedBy,\n\tContains,\n\tDelete,\n\tDenseRank,\n\tDesc,\n\tDescendant,\n\tDistinct,\n\tDot,\n\tElse,\n\tEnd,\n\tEquals,\n\tEvery,\n\tExcept,\n\tExists,\n\tFalse,\n\tFlat,\n\tForKeyShare,\n\tForNoKeyUpdate,\n\tForShare,\n\tForUpdate,\n\tFrom,\n\tGreaterThan,\n\tGreaterThanOrEqual,\n\tGroupBy,\n\tIdentifier,\n\tIn,\n\tInsert,\n\tIntersect,\n\tInto,\n\tIs,\n\tJsonArrow,\n\tJsonArrowText,\n\tJsonContainedByOp,\n\tJsonContainsOp,\n\tJsonExistsOp,\n\tLag,\n\tLBracket,\n\tLead,\n\tLessThan,\n\tLessThanOrEqual,\n\tLike,\n\tLimit,\n\tLParen,\n\tMinus,\n\tNamedParam,\n\tNone,\n\tNot,\n\tNotEquals,\n\tNoWait,\n\tNqlLexer,\n\tNull,\n\tNumberLiteral,\n\tOffset,\n\tOn,\n\tOr,\n\tOrderBy,\n\tOver,\n\tOverlaps,\n\tParent,\n\tPartitionBy,\n\tPercent,\n\tPipe,\n\tPlus,\n\tQuotedIdentifier,\n\tRangeValue,\n\tRank,\n\tRBracket,\n\tRowNumber,\n\tRParen,\n\tSelect,\n\tSetKeyword,\n\tSkipLocked,\n\tSlash,\n\tSome,\n\tStar,\n\tStringLiteral,\n\tThen,\n\tTrue,\n\tUnion,\n\tUpdate,\n\tUpsert,\n\tValues,\n\tWhen,\n\tWhere,\n\tWith,\n} from '../lexer/tokens.js';\n\n/**\n * NQL Parser using Chevrotain CstParser\n */\nexport class NqlParser extends CstParser {\n\tconstructor() {\n\t\tsuper(allTokens, {\n\t\t\trecoveryEnabled: true, // Enable error recovery for better error messages\n\t\t});\n\t\tthis.performSelfAnalysis();\n\t}\n\n\t/**\n\t * Check if a token type can appear as an identifier segment.\n\t * This includes regular identifiers, quoted identifiers, and pseudo-column keywords\n\t * (parent, child, ascendant, descendant) which can be used in paths.\n\t */\n\tprivate isIdentifierLike(tokenType: unknown): boolean {\n\t\treturn (\n\t\t\ttokenType === Identifier ||\n\t\t\ttokenType === QuotedIdentifier ||\n\t\t\ttokenType === Parent ||\n\t\t\ttokenType === Child ||\n\t\t\ttokenType === Ascendant ||\n\t\t\ttokenType === Descendant\n\t\t);\n\t}\n\n\t// ============================================================\n\t// TOP-LEVEL RULES\n\t// ============================================================\n\n\t/**\n\t * program = { statement } ;\n\t * Supports multiple statements (queries or mutations)\n\t */\n\tpublic program = this.RULE('program', () => {\n\t\tthis.MANY(() => {\n\t\t\tthis.SUBRULE(this.statement);\n\t\t});\n\t});\n\n\t/**\n\t * statement = withQuery | query | mutation_pipeline ;\n\t * withQuery is tried first via GATE to avoid ambiguity with 'with' as identifier.\n\t */\n\tprivate statement = this.RULE('statement', () => {\n\t\tthis.OR([\n\t\t\t{\n\t\t\t\tGATE: () => this.LA(1).tokenType === With,\n\t\t\t\tALT: () => this.SUBRULE(this.withQuery),\n\t\t\t},\n\t\t\t{ ALT: () => this.SUBRULE(this.mutationPipeline) },\n\t\t\t{ ALT: () => this.SUBRULE(this.query) },\n\t\t]);\n\t});\n\n\t/**\n\t * withQuery = \"with\" cteList query ;\n\t */\n\tpublic withQuery = this.RULE('withQuery', () => {\n\t\tthis.CONSUME(With);\n\t\tthis.SUBRULE(this.cteList);\n\t\tthis.SUBRULE(this.query);\n\t});\n\n\t/**\n\t * cteList = cteItem { \",\" cteItem } ;\n\t */\n\tprivate cteList = this.RULE('cteList', () => {\n\t\tthis.SUBRULE(this.cteItem);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Comma);\n\t\t\tthis.SUBRULE2(this.cteItem);\n\t\t});\n\t});\n\n\t/**\n\t * cteItem = identSegment \"as\" \"(\" query \")\" ;\n\t */\n\tprivate cteItem = this.RULE('cteItem', () => {\n\t\tthis.SUBRULE(this.identSegment);\n\t\tthis.CONSUME(As);\n\t\tthis.CONSUME(LParen);\n\t\tthis.SUBRULE(this.query);\n\t\tthis.CONSUME(RParen);\n\t});\n\n\t// ============================================================\n\t// QUERIES\n\t// ============================================================\n\n\t/**\n\t * query = table_ref { \"|\" query_clause } ;\n\t */\n\tpublic query = this.RULE('query', () => {\n\t\tthis.SUBRULE(this.tableRef);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Pipe);\n\t\t\tthis.SUBRULE(this.queryClause);\n\t\t});\n\t});\n\n\t/**\n\t * table_ref = ident_segment ;\n\t */\n\tprivate tableRef = this.RULE('tableRef', () => {\n\t\tthis.SUBRULE(this.identSegment);\n\t});\n\n\t/**\n\t * query_clause = where_clause | select_clause | flat_clause\n\t * | group_clause | order_clause | limit_clause | offset_clause | bind_clause ;\n\t */\n\tprivate queryClause = this.RULE('queryClause', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.SUBRULE(this.whereClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.selectClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.flatClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.groupClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.orderClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.limitClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.offsetClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.setClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.bindClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.lockClause) },\n\t\t]);\n\t});\n\n\t// ============================================================\n\t// CLAUSES\n\t// ============================================================\n\n\t/**\n\t * where_clause = \"where\" boolean_expr ;\n\t */\n\tprivate whereClause = this.RULE('whereClause', () => {\n\t\tthis.CONSUME(Where);\n\t\tthis.SUBRULE(this.booleanExpr);\n\t});\n\n\t/**\n\t * select_clause = \"select\" [ \"distinct\" ] select_list ;\n\t */\n\tprivate selectClause = this.RULE('selectClause', () => {\n\t\tthis.CONSUME(Select);\n\t\tthis.OPTION(() => this.CONSUME(Distinct));\n\t\tthis.SUBRULE(this.selectList);\n\t});\n\n\t/**\n\t * flat_clause = \"flat\" ;\n\t * NQL v2.1: Forces JOIN strategy instead of json_agg for relation includes\n\t */\n\tprivate flatClause = this.RULE('flatClause', () => {\n\t\tthis.CONSUME(Flat);\n\t});\n\n\t/**\n\t * group_clause = \"group\" \"by\" expr_list ;\n\t */\n\tprivate groupClause = this.RULE('groupClause', () => {\n\t\tthis.CONSUME(GroupBy);\n\t\tthis.SUBRULE(this.exprList);\n\t});\n\n\t/**\n\t * order_clause = \"order\" \"by\" order_list ;\n\t */\n\tprivate orderClause = this.RULE('orderClause', () => {\n\t\tthis.CONSUME(OrderBy);\n\t\tthis.SUBRULE(this.orderList);\n\t});\n\n\t/**\n\t * limit_clause = \"limit\" [ident_segment (\".\" ident_segment)*] NUMBER ;\n\t */\n\tprivate limitClause = this.RULE('limitClause', () => {\n\t\tthis.CONSUME(Limit);\n\t\t// Per-include limit: limit <relation> <N>\n\t\t// Outer limit: limit <N>\n\t\t// LL(1): IDENTIFIER → per-include, NUMBER → outer\n\t\tthis.OPTION(() => {\n\t\t\tthis.SUBRULE(this.identSegment);\n\t\t\tthis.MANY(() => {\n\t\t\t\tthis.CONSUME(Dot);\n\t\t\t\tthis.SUBRULE2(this.identSegment);\n\t\t\t});\n\t\t});\n\t\tthis.CONSUME(NumberLiteral);\n\t});\n\n\t/**\n\t * offset_clause = \"offset\" NUMBER ;\n\t */\n\tprivate offsetClause = this.RULE('offsetClause', () => {\n\t\tthis.CONSUME(Offset);\n\t\tthis.CONSUME(NumberLiteral);\n\t});\n\n\t/**\n\t * lock_clause = lock_strength [ lock_wait_policy ] ;\n\t * lock_strength = \"for update\" | \"for share\" | \"for no key update\" | \"for key share\" ;\n\t * lock_wait_policy = \"skip locked\" | \"nowait\" ;\n\t */\n\tprivate lockClause = this.RULE('lockClause', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(ForNoKeyUpdate) },\n\t\t\t{ ALT: () => this.CONSUME(ForKeyShare) },\n\t\t\t{ ALT: () => this.CONSUME(ForUpdate) },\n\t\t\t{ ALT: () => this.CONSUME(ForShare) },\n\t\t]);\n\t\tthis.OPTION(() => {\n\t\t\tthis.OR2([\n\t\t\t\t{ ALT: () => this.CONSUME(SkipLocked) },\n\t\t\t\t{ ALT: () => this.CONSUME(NoWait) },\n\t\t\t]);\n\t\t});\n\t});\n\n\t// ============================================================\n\t// SELECT\n\t// ============================================================\n\n\t/**\n\t * select_list = select_item { \",\" select_item } ;\n\t */\n\tprivate selectList = this.RULE('selectList', () => {\n\t\tthis.SUBRULE(this.selectItem);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Comma);\n\t\t\tthis.SUBRULE2(this.selectItem);\n\t\t});\n\t});\n\n\t/**\n\t * select_item = \"*\" | path_star | expr [ \"as\" ident_segment ] ;\n\t * where path_star = ident { \".\" ident } \".\" \"*\"\n\t */\n\tprivate selectItem = this.RULE('selectItem', () => {\n\t\tthis.OR([\n\t\t\t// Star alone - matches `*`\n\t\t\t{\n\t\t\t\tGATE: () => this.LA(1).tokenType === Star,\n\t\t\t\tALT: () => this.CONSUME(Star),\n\t\t\t},\n\t\t\t// path.* (relation star) - matches `relation.*` or `a.b.*`\n\t\t\t{\n\t\t\t\tGATE: () => this.isRelationStar(),\n\t\t\t\tALT: () => this.SUBRULE(this.relationStarExpr),\n\t\t\t},\n\t\t\t// expr [ \"as\" alias ]\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.SUBRULE(this.expression);\n\t\t\t\t\tthis.OPTION(() => {\n\t\t\t\t\t\tthis.CONSUME(As);\n\t\t\t\t\t\tthis.SUBRULE(this.identSegment);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t/**\n\t * relation_star_expr = ident { \".\" ident } \".\" \"*\"\n\t * Parses `relation.*` or `a.b.c.*` patterns\n\t */\n\tprivate relationStarExpr = this.RULE('relationStarExpr', () => {\n\t\tthis.SUBRULE(this.identSegment);\n\t\t// Parse zero or more `.ident` pairs, stopping before `.*`\n\t\tthis.MANY({\n\t\t\tGATE: () => {\n\t\t\t\t// Continue if next is `.ident`, stop if next is `.*`\n\t\t\t\treturn (\n\t\t\t\t\tthis.LA(1).tokenType === Dot &&\n\t\t\t\t\tthis.isIdentifierLike(this.LA(2).tokenType)\n\t\t\t\t);\n\t\t\t},\n\t\t\tDEF: () => {\n\t\t\t\tthis.CONSUME(Dot);\n\t\t\t\tthis.SUBRULE2(this.identSegment);\n\t\t\t},\n\t\t});\n\t\t// Consume the final `.*`\n\t\tthis.CONSUME2(Dot);\n\t\tthis.CONSUME(Star);\n\t});\n\n\t/**\n\t * Check if current position looks like `path.*`\n\t */\n\tprivate isRelationStar(): boolean {\n\t\t// Look ahead to find pattern: ident(.ident)*.star\n\t\tlet i = 1;\n\t\twhile (this.isIdentifierLike(this.LA(i).tokenType)) {\n\t\t\ti++;\n\t\t\tif (this.LA(i).tokenType === Dot) {\n\t\t\t\ti++;\n\t\t\t\t// Check if it's .* or .ident\n\t\t\t\tif (this.LA(i).tokenType === Star) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t// ============================================================\n\t// ORDER\n\t// ============================================================\n\n\t/**\n\t * order_list = order_item { \",\" order_item } ;\n\t */\n\tprivate orderList = this.RULE('orderList', () => {\n\t\tthis.SUBRULE(this.orderItem);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Comma);\n\t\t\tthis.SUBRULE2(this.orderItem);\n\t\t});\n\t});\n\n\t/**\n\t * order_item = expr [ \"asc\" | \"desc\" ] ;\n\t */\n\tprivate orderItem = this.RULE('orderItem', () => {\n\t\tthis.SUBRULE(this.expression);\n\t\tthis.OPTION(() => {\n\t\t\tthis.OR([\n\t\t\t\t{ ALT: () => this.CONSUME(Asc) },\n\t\t\t\t{ ALT: () => this.CONSUME(Desc) },\n\t\t\t]);\n\t\t});\n\t});\n\n\t// ============================================================\n\t// EXPRESSIONS\n\t// ============================================================\n\n\t/**\n\t * boolean_expr = or_expr ;\n\t */\n\tprivate booleanExpr = this.RULE('booleanExpr', () => {\n\t\tthis.SUBRULE(this.orExpr);\n\t});\n\n\t/**\n\t * or_expr = and_expr { \"or\" and_expr } ;\n\t */\n\tprivate orExpr = this.RULE('orExpr', () => {\n\t\tthis.SUBRULE(this.andExpr);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Or);\n\t\t\tthis.SUBRULE2(this.andExpr);\n\t\t});\n\t});\n\n\t/**\n\t * and_expr = not_expr { \"and\" not_expr } ;\n\t */\n\tprivate andExpr = this.RULE('andExpr', () => {\n\t\tthis.SUBRULE(this.notExpr);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(And);\n\t\t\tthis.SUBRULE2(this.notExpr);\n\t\t});\n\t});\n\n\t/**\n\t * not_expr = [ \"not\" ] primary_cond ;\n\t */\n\tprivate notExpr = this.RULE('notExpr', () => {\n\t\tthis.OPTION(() => this.CONSUME(Not));\n\t\tthis.SUBRULE(this.primaryCond);\n\t});\n\n\t/**\n\t * primary_cond = \"(\" boolean_expr \")\"\n\t * | quantified_relation_filter -- SPEC-002: some()/none()/every()\n\t * | all_relation_filter -- SPEC-002: all relation.col = val\n\t * | exists_check\n\t * | comparison / between / in / is_null ;\n\t */\n\tprivate primaryCond = this.RULE('primaryCond', () => {\n\t\tthis.OR([\n\t\t\t// Parenthesized boolean expression\n\t\t\t{\n\t\t\t\tGATE: () => this.LA(1).tokenType === LParen && !this.isScalarSubquery(),\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.CONSUME(LParen);\n\t\t\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t\t\t\tthis.CONSUME(RParen);\n\t\t\t\t},\n\t\t\t},\n\t\t\t// SPEC-002: Explicit quantifiers - some()/none()/every()\n\t\t\t{\n\t\t\t\tGATE: () =>\n\t\t\t\t\tthis.LA(1).tokenType === Some ||\n\t\t\t\t\tthis.LA(1).tokenType === None ||\n\t\t\t\t\tthis.LA(1).tokenType === Every,\n\t\t\t\tALT: () => this.SUBRULE(this.quantifiedRelationFilter),\n\t\t\t},\n\t\t\t// SPEC-002: ALL quantifier prefix - all relation.col = val\n\t\t\t{\n\t\t\t\tGATE: () => this.LA(1).tokenType === All,\n\t\t\t\tALT: () => this.SUBRULE(this.allRelationFilter),\n\t\t\t},\n\t\t\t// EXISTS check\n\t\t\t{\n\t\t\t\tALT: () => this.SUBRULE(this.existsCheck),\n\t\t\t},\n\t\t\t// Expression-based conditions (comparison, between, in, is null)\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\t// Parse the left expression first\n\t\t\t\t\tthis.SUBRULE(this.expression);\n\t\t\t\t\t// Then check what follows — OPTION allows bare predicates (json_contains, json_exists)\n\t\t\t\t\tthis.OPTION2(() => {\n\t\t\t\t\t\tthis.OR2([\n\t\t\t\t\t\t\t// BETWEEN expr AND expr\n\t\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.betweenSuffix) },\n\t\t\t\t\t\t\t// [NOT] IN (...)\n\t\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.inSuffix) },\n\t\t\t\t\t\t\t// = ANY(:param) — BATCH-001\n\t\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.anySuffix) },\n\t\t\t\t\t\t\t// IS [NOT] NULL\n\t\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.isNullSuffix) },\n\t\t\t\t\t\t\t// Range operators (overlaps, contains, containedBy) with range literal\n\t\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.rangeOpSuffix) },\n\t\t\t\t\t\t\t// JSONB comparison operators (@>, <@, ?)\n\t\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.jsonComparisonSuffix) },\n\t\t\t\t\t\t\t// comparison (=, !=, <, >, <=, >=, like)\n\t\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.comparisonSuffix) },\n\t\t\t\t\t\t]);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t/**\n\t * comparison_suffix = comp_op expr ;\n\t */\n\tprivate comparisonSuffix = this.RULE('comparisonSuffix', () => {\n\t\tthis.SUBRULE(this.compOp);\n\t\tthis.SUBRULE(this.expression);\n\t});\n\n\t/**\n\t * json_comparison_suffix = (\"@>\" | \"<@\" | \"?\") expression ;\n\t * JSONB containment and key-existence operators.\n\t */\n\tprivate jsonComparisonSuffix = this.RULE('jsonComparisonSuffix', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(JsonContainsOp) },\n\t\t\t{ ALT: () => this.CONSUME(JsonContainedByOp) },\n\t\t\t{ ALT: () => this.CONSUME(JsonExistsOp) },\n\t\t]);\n\t\tthis.SUBRULE(this.expression);\n\t});\n\n\t/**\n\t * comp_op = \"=\" | \"!=\" | \"<\" | \">\" | \"<=\" | \">=\" | \"like\" ;\n\t * Note: Range operators (overlaps, contains, containedBy) are handled\n\t * separately in rangeOpSuffix to allow (value,value) range syntax.\n\t */\n\tprivate compOp = this.RULE('compOp', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(Equals) },\n\t\t\t{ ALT: () => this.CONSUME(NotEquals) },\n\t\t\t{ ALT: () => this.CONSUME(LessThan) },\n\t\t\t{ ALT: () => this.CONSUME(GreaterThan) },\n\t\t\t{ ALT: () => this.CONSUME(LessThanOrEqual) },\n\t\t\t{ ALT: () => this.CONSUME(GreaterThanOrEqual) },\n\t\t\t{ ALT: () => this.CONSUME(Like) },\n\t\t]);\n\t});\n\n\t/**\n\t * range_op = \"overlaps\" | \"contains\" | \"containedBy\" ;\n\t * PostgreSQL range operators - handled separately to support (value,value) syntax.\n\t */\n\tprivate rangeOp = this.RULE('rangeOp', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(Overlaps) },\n\t\t\t{ ALT: () => this.CONSUME(Contains) },\n\t\t\t{ ALT: () => this.CONSUME(ContainedBy) },\n\t\t]);\n\t});\n\n\t/**\n\t * range_op_suffix = range_op (range_literal | literal) ;\n\t * Example: overlaps [1,10) or contains (0,100) or contains 25\n\t * Note: contains can take a scalar value (e.g., contains 25 checks if range contains the value)\n\t */\n\tprivate rangeOpSuffix = this.RULE('rangeOpSuffix', () => {\n\t\tthis.SUBRULE(this.rangeOp);\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.SUBRULE(this.rangeLiteral) },\n\t\t\t{ ALT: () => this.SUBRULE2(this.literal) },\n\t\t]);\n\t});\n\n\t/**\n\t * between_suffix = \"between\" expr \"and\" expr ;\n\t */\n\tprivate betweenSuffix = this.RULE('betweenSuffix', () => {\n\t\tthis.CONSUME(Between);\n\t\tthis.SUBRULE(this.expression);\n\t\tthis.CONSUME(And);\n\t\tthis.SUBRULE2(this.expression);\n\t});\n\n\t/**\n\t * exists_check = [ \"not\" ] \"exists\" \"(\" scalar_subquery \")\" ;\n\t */\n\tprivate existsCheck = this.RULE('existsCheck', () => {\n\t\tthis.OPTION(() => this.CONSUME(Not));\n\t\tthis.CONSUME(Exists);\n\t\tthis.CONSUME(LParen);\n\t\tthis.SUBRULE(this.scalarSubquery);\n\t\tthis.CONSUME(RParen);\n\t});\n\n\t// ============================================================\n\t// SPEC-002: RELATION FILTER EXPRESSIONS\n\t// ============================================================\n\n\t/**\n\t * SPEC-002: Explicit quantifier function\n\t * quantified_relation_filter = quantifier \"(\" path_expr \")\" \".\" ident_segment comp_op expr\n\t * | quantifier \"(\" path_expr [ \"as\" IDENT ] \",\" boolean_expr \")\" ;\n\t * quantifier = \"some\" | \"none\" | \"every\" ;\n\t *\n\t * Examples:\n\t * some(posts).featured = true\n\t * none(posts).published = true\n\t * every(posts).status = 'approved'\n\t * some(posts as p, p.featured = true and p.published = true)\n\t */\n\tprivate quantifiedRelationFilter = this.RULE(\n\t\t'quantifiedRelationFilter',\n\t\t() => {\n\t\t\t// Quantifier keyword\n\t\t\tthis.OR([\n\t\t\t\t{ ALT: () => this.CONSUME(Some) },\n\t\t\t\t{ ALT: () => this.CONSUME(None) },\n\t\t\t\t{ ALT: () => this.CONSUME(Every) },\n\t\t\t]);\n\t\t\tthis.CONSUME(LParen);\n\t\t\t// Relation path\n\t\t\tthis.SUBRULE(this.pathExpr);\n\t\t\t// Check what follows: ) . column or as alias , condition )\n\t\t\tthis.OR2([\n\t\t\t\t// Simple form: some(posts).column = value\n\t\t\t\t{\n\t\t\t\t\tGATE: () =>\n\t\t\t\t\t\tthis.LA(1).tokenType === RParen && this.LA(2).tokenType === Dot,\n\t\t\t\t\tALT: () => {\n\t\t\t\t\t\tthis.CONSUME(RParen);\n\t\t\t\t\t\tthis.CONSUME(Dot);\n\t\t\t\t\t\tthis.SUBRULE(this.identSegment);\n\t\t\t\t\t\tthis.SUBRULE(this.compOp);\n\t\t\t\t\t\tthis.SUBRULE(this.expression);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// Aliased form: some(posts as p, condition)\n\t\t\t\t{\n\t\t\t\t\tGATE: () => this.LA(1).tokenType === As,\n\t\t\t\t\tALT: () => {\n\t\t\t\t\t\tthis.CONSUME(As);\n\t\t\t\t\t\tthis.SUBRULE2(this.identSegment);\n\t\t\t\t\t\tthis.CONSUME(Comma);\n\t\t\t\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t\t\t\t\tthis.CONSUME2(RParen);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t// Direct condition form: some(posts, condition)\n\t\t\t\t{\n\t\t\t\t\tGATE: () => this.LA(1).tokenType === Comma,\n\t\t\t\t\tALT: () => {\n\t\t\t\t\t\tthis.CONSUME2(Comma);\n\t\t\t\t\t\tthis.SUBRULE2(this.booleanExpr);\n\t\t\t\t\t\tthis.CONSUME3(RParen);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t]);\n\t\t},\n\t);\n\n\t/**\n\t * SPEC-002: ALL quantifier prefix for implicit relation filter\n\t * all_relation_filter = \"all\" path_expr comp_op expr ;\n\t *\n\t * The path_expr contains both the relation and column, e.g., posts.featured\n\t * The visitor will split it: relation = all but last segment, column = last segment\n\t *\n\t * Examples:\n\t * all posts.featured = true (relation: posts, column: featured)\n\t * all author.posts.published = true (relation: author.posts, column: published)\n\t */\n\tprivate allRelationFilter = this.RULE('allRelationFilter', () => {\n\t\tthis.CONSUME(All);\n\t\tthis.SUBRULE(this.pathExpr);\n\t\tthis.SUBRULE(this.compOp);\n\t\tthis.SUBRULE(this.expression);\n\t});\n\n\t/**\n\t * in_suffix = [ \"not\" ] \"in\" ( \"(\" value_list \")\" | \"(\" scalar_subquery \")\" | date_range_literal ) ;\n\t */\n\t/**\n\t * any_suffix = '=' 'ANY' '(' ':' identifier ')' ;\n\t * BATCH-001: Parses the ANY(:paramName) suffix after a column expression.\n\t * Example: id = ANY(:ids)\n\t */\n\tprivate anySuffix = this.RULE('anySuffix', () => {\n\t\tthis.CONSUME(Equals);\n\t\tthis.CONSUME(Any);\n\t\tthis.CONSUME(LParen);\n\t\tthis.CONSUME(NamedParam);\n\t\tthis.CONSUME(RParen);\n\t});\n\n\tprivate inSuffix = this.RULE('inSuffix', () => {\n\t\tthis.OPTION(() => this.CONSUME(Not));\n\t\tthis.CONSUME(In);\n\t\tthis.OR([\n\t\t\t// Date range literal (string without parentheses)\n\t\t\t{\n\t\t\t\tGATE: () => this.LA(1).tokenType === StringLiteral,\n\t\t\t\tALT: () => this.CONSUME(StringLiteral),\n\t\t\t},\n\t\t\t// Parenthesized: either value list or subquery\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.CONSUME(LParen);\n\t\t\t\t\tthis.OR2([\n\t\t\t\t\t\t// Subquery (starts with identifier and has pipe)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tGATE: () => this.isScalarSubqueryInParen(),\n\t\t\t\t\t\t\tALT: () => this.SUBRULE(this.scalarSubquery),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Value list\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tALT: () => this.SUBRULE(this.valueList),\n\t\t\t\t\t\t},\n\t\t\t\t\t]);\n\t\t\t\t\tthis.CONSUME(RParen);\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t/**\n\t * is_null_suffix = \"is\" [ \"not\" ] \"null\" ;\n\t */\n\tprivate isNullSuffix = this.RULE('isNullSuffix', () => {\n\t\tthis.CONSUME(Is);\n\t\tthis.OPTION(() => this.CONSUME(Not));\n\t\tthis.CONSUME(Null);\n\t});\n\n\t/**\n\t * Check if inside parentheses we have a scalar subquery\n\t * A scalar subquery MUST have at least one pipe\n\t */\n\tprivate isScalarSubqueryInParen(): boolean {\n\t\t// Look for: ident | ...\n\t\tlet i = 1;\n\t\t// Skip identifier(s)\n\t\twhile (this.isIdentifierLike(this.LA(i).tokenType)) {\n\t\t\ti++;\n\t\t\tif (this.LA(i).tokenType === Dot) {\n\t\t\t\ti++;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t// Must have pipe for it to be a subquery\n\t\treturn this.LA(i).tokenType === Pipe;\n\t}\n\n\t/**\n\t * Check if we're looking at a scalar subquery (for expression context)\n\t */\n\tprivate isScalarSubquery(): boolean {\n\t\t// After ( we need ident | to be a subquery\n\t\tif (this.LA(1).tokenType !== LParen) return false;\n\t\tlet i = 2;\n\t\twhile (this.isIdentifierLike(this.LA(i).tokenType)) {\n\t\t\ti++;\n\t\t\tif (this.LA(i).tokenType === Dot) {\n\t\t\t\ti++;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn this.LA(i).tokenType === Pipe;\n\t}\n\n\t// ============================================================\n\t// ARITHMETIC EXPRESSIONS\n\t// ============================================================\n\n\t/**\n\t * expr = add_expr ;\n\t */\n\tprivate expression = this.RULE('expression', () => {\n\t\tthis.SUBRULE(this.addExpr);\n\t});\n\n\t/**\n\t * add_expr = mul_expr { (\"+\" | \"-\") mul_expr } ;\n\t */\n\tprivate addExpr = this.RULE('addExpr', () => {\n\t\tthis.SUBRULE(this.mulExpr);\n\t\tthis.MANY(() => {\n\t\t\tthis.OR([\n\t\t\t\t{ ALT: () => this.CONSUME(Plus) },\n\t\t\t\t{ ALT: () => this.CONSUME(Minus) },\n\t\t\t]);\n\t\t\tthis.SUBRULE2(this.mulExpr);\n\t\t});\n\t});\n\n\t/**\n\t * mul_expr = unary_expr { (\"*\" | \"/\" | \"%\") unary_expr } ;\n\t */\n\tprivate mulExpr = this.RULE('mulExpr', () => {\n\t\tthis.SUBRULE(this.unaryExpr);\n\t\tthis.MANY(() => {\n\t\t\tthis.OR([\n\t\t\t\t{ ALT: () => this.CONSUME(Star) },\n\t\t\t\t{ ALT: () => this.CONSUME(Slash) },\n\t\t\t\t{ ALT: () => this.CONSUME(Percent) },\n\t\t\t]);\n\t\t\tthis.SUBRULE2(this.unaryExpr);\n\t\t});\n\t});\n\n\t/**\n\t * unary_expr = [ \"-\" ] json_access_expr ;\n\t */\n\tprivate unaryExpr = this.RULE('unaryExpr', () => {\n\t\tthis.OPTION(() => this.CONSUME(Minus));\n\t\tthis.SUBRULE(this.jsonAccessExpr);\n\t});\n\n\t/**\n\t * json_access_expr = primary_expr { (\"->\" | \"->>\") string_literal } ;\n\t * Chained JSON path access: col->'a'->'b'->>'c'\n\t */\n\tprivate jsonAccessExpr = this.RULE('jsonAccessExpr', () => {\n\t\tthis.SUBRULE(this.primaryExpr);\n\t\tthis.MANY(() => {\n\t\t\tthis.OR([\n\t\t\t\t{ ALT: () => this.CONSUME(JsonArrowText) },\n\t\t\t\t{ ALT: () => this.CONSUME(JsonArrow) },\n\t\t\t]);\n\t\t\tthis.SUBRULE(this.literal);\n\t\t});\n\t});\n\n\t/**\n\t * primary_expr = literal | case_expr | path_expr | func_call | \"(\" expr \")\" | \"(\" scalar_subquery \")\" ;\n\t */\n\tprivate primaryExpr = this.RULE('primaryExpr', () => {\n\t\tthis.OR([\n\t\t\t// Range literal in value context (unambiguous: starts with '[')\n\t\t\t{\n\t\t\t\tGATE: () => this.LA(1).tokenType === LBracket,\n\t\t\t\tALT: () => this.SUBRULE(this.rangeLiteral),\n\t\t\t},\n\t\t\t// Literal\n\t\t\t{ ALT: () => this.SUBRULE(this.literal) },\n\t\t\t// CASE expression: CASE WHEN ... THEN ... [ELSE ...] END\n\t\t\t{\n\t\t\t\tGATE: () => this.LA(1).tokenType === Case,\n\t\t\t\tALT: () => this.SUBRULE(this.caseExpr),\n\t\t\t},\n\t\t\t// Function call: ident(...) or window function keyword(...)\n\t\t\t{\n\t\t\t\tGATE: () =>\n\t\t\t\t\t(this.LA(1).tokenType === Identifier ||\n\t\t\t\t\t\tthis.LA(1).tokenType === QuotedIdentifier ||\n\t\t\t\t\t\tthis.LA(1).tokenType === RowNumber ||\n\t\t\t\t\t\tthis.LA(1).tokenType === Rank ||\n\t\t\t\t\t\tthis.LA(1).tokenType === DenseRank ||\n\t\t\t\t\t\tthis.LA(1).tokenType === Lag ||\n\t\t\t\t\t\tthis.LA(1).tokenType === Lead) &&\n\t\t\t\t\tthis.LA(2).tokenType === LParen,\n\t\t\t\tALT: () => this.SUBRULE(this.funcCall),\n\t\t\t},\n\t\t\t// Path expression: ident.ident...\n\t\t\t{ ALT: () => this.SUBRULE(this.pathExpr) },\n\t\t\t// Parenthesized: either expression or scalar subquery\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.CONSUME(LParen);\n\t\t\t\t\tthis.OR2([\n\t\t\t\t\t\t// Scalar subquery\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tGATE: () => this.isScalarSubqueryStart(),\n\t\t\t\t\t\t\tALT: () => this.SUBRULE(this.scalarSubquery),\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// Expression\n\t\t\t\t\t\t{ ALT: () => this.SUBRULE(this.expression) },\n\t\t\t\t\t]);\n\t\t\t\t\tthis.CONSUME(RParen);\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t/**\n\t * Check if at start of scalar subquery (ident | ...)\n\t */\n\tprivate isScalarSubqueryStart(): boolean {\n\t\tlet i = 1;\n\t\twhile (this.isIdentifierLike(this.LA(i).tokenType)) {\n\t\t\ti++;\n\t\t\tif (this.LA(i).tokenType === Dot) {\n\t\t\t\ti++;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn this.LA(i).tokenType === Pipe;\n\t}\n\n\t/**\n\t * scalar_subquery = query ;\n\t * Delegates to the `query` rule (gate already ensures at least one pipe).\n\t */\n\tprivate scalarSubquery = this.RULE('scalarSubquery', () => {\n\t\tthis.SUBRULE(this.query);\n\t});\n\n\t/**\n\t * path_expr = ident_segment { \".\" ident_segment } ;\n\t */\n\tprivate pathExpr = this.RULE('pathExpr', () => {\n\t\tthis.SUBRULE(this.identSegment);\n\t\t// Optional depth hint: ascendant[3].column → bounded traversal\n\t\tthis.OPTION2(() => {\n\t\t\tthis.CONSUME(LBracket);\n\t\t\tthis.CONSUME(NumberLiteral);\n\t\t\tthis.CONSUME(RBracket);\n\t\t});\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Dot);\n\t\t\tthis.SUBRULE2(this.identSegment);\n\t\t});\n\t});\n\n\t/**\n\t * case_expr = \"CASE\" ( searched_case_body | simple_case_body ) [ else_clause ] \"END\" ;\n\t * searched_case_body = \"WHEN\" boolean_expr \"THEN\" expression { \"WHEN\" boolean_expr \"THEN\" expression } ;\n\t * simple_case_body = expression \"WHEN\" expression \"THEN\" expression { \"WHEN\" expression \"THEN\" expression } ;\n\t * else_clause = \"ELSE\" expression ;\n\t */\n\tprivate caseExpr = this.RULE('caseExpr', () => {\n\t\tthis.CONSUME(Case);\n\t\tthis.OR([\n\t\t\t{\n\t\t\t\t// Searched CASE: CASE WHEN bool_expr THEN expr ...\n\t\t\t\tGATE: () => this.LA(1).tokenType === When,\n\t\t\t\tALT: () => this.SUBRULE(this.searchedCaseBody),\n\t\t\t},\n\t\t\t{\n\t\t\t\t// Simple CASE: CASE expr WHEN val THEN result ...\n\t\t\t\tALT: () => this.SUBRULE(this.simpleCaseBody),\n\t\t\t},\n\t\t]);\n\t\t// Optional ELSE clause\n\t\tthis.OPTION(() => {\n\t\t\tthis.CONSUME(Else);\n\t\t\tthis.SUBRULE(this.expression);\n\t\t});\n\t\tthis.CONSUME(End);\n\t});\n\n\t/**\n\t * searched_case_body = \"WHEN\" boolean_expr \"THEN\" expression { ... } ;\n\t */\n\tprivate searchedCaseBody = this.RULE('searchedCaseBody', () => {\n\t\tthis.AT_LEAST_ONE(() => {\n\t\t\tthis.CONSUME(When);\n\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t\tthis.CONSUME(Then);\n\t\t\tthis.SUBRULE(this.expression);\n\t\t});\n\t});\n\n\t/**\n\t * simple_case_body = expression \"WHEN\" expression \"THEN\" expression { ... } ;\n\t */\n\tprivate simpleCaseBody = this.RULE('simpleCaseBody', () => {\n\t\tthis.SUBRULE(this.expression); // Subject expression\n\t\tthis.AT_LEAST_ONE(() => {\n\t\t\tthis.CONSUME(When);\n\t\t\tthis.SUBRULE2(this.expression); // Value to compare against\n\t\t\tthis.CONSUME(Then);\n\t\t\tthis.SUBRULE3(this.expression); // Result expression\n\t\t});\n\t});\n\n\t/**\n\t * func_call = ( window_func | IDENT ) \"(\" [ func_arg_list ] \")\" [ window_clause ] ;\n\t * window_func = \"row_number\" | \"rank\" | \"dense_rank\" | \"lag\" | \"lead\" ;\n\t * Regular functions can also have OVER (e.g., sum(x) OVER (...))\n\t */\n\tprivate funcCall = this.RULE('funcCall', () => {\n\t\t// Window function keyword or regular identifier\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(RowNumber) },\n\t\t\t{ ALT: () => this.CONSUME(Rank) },\n\t\t\t{ ALT: () => this.CONSUME(DenseRank) },\n\t\t\t{ ALT: () => this.CONSUME(Lag) },\n\t\t\t{ ALT: () => this.CONSUME(Lead) },\n\t\t\t{ ALT: () => this.SUBRULE(this.identSegment) },\n\t\t]);\n\t\tthis.CONSUME(LParen);\n\t\tthis.OPTION(() => this.SUBRULE(this.funcArgList));\n\t\tthis.CONSUME(RParen);\n\t\t// Optional OVER clause (makes it a window function)\n\t\tthis.OPTION2(() => this.SUBRULE(this.windowClause));\n\t});\n\n\t/**\n\t * window_clause = \"over\" \"(\" [ partition_clause ] [ order_clause_in_window ] \")\" ;\n\t */\n\tprivate windowClause = this.RULE('windowClause', () => {\n\t\tthis.CONSUME(Over);\n\t\tthis.CONSUME(LParen);\n\t\tthis.OPTION(() => this.SUBRULE(this.partitionClause));\n\t\tthis.OPTION2(() => this.SUBRULE(this.orderClauseInWindow));\n\t\tthis.CONSUME(RParen);\n\t});\n\n\t/**\n\t * partition_clause = \"partition\" \"by\" expr_list ;\n\t */\n\tprivate partitionClause = this.RULE('partitionClause', () => {\n\t\tthis.CONSUME(PartitionBy);\n\t\tthis.SUBRULE(this.exprList);\n\t});\n\n\t/**\n\t * order_clause_in_window = \"order\" \"by\" order_list ;\n\t * Same as orderClause but separate rule for clarity\n\t */\n\tprivate orderClauseInWindow = this.RULE('orderClauseInWindow', () => {\n\t\tthis.CONSUME(OrderBy);\n\t\tthis.SUBRULE(this.orderList);\n\t});\n\n\t/**\n\t * Function argument list - handles count(*) and DISTINCT specially\n\t * func_arg_list = \"*\" | [ \"distinct\" ] expr_list ;\n\t */\n\tprivate funcArgList = this.RULE('funcArgList', () => {\n\t\tthis.OR([\n\t\t\t// count(*) special case\n\t\t\t{ ALT: () => this.CONSUME(Star) },\n\t\t\t// Optional DISTINCT modifier + expression list\n\t\t\t// e.g., count(distinct status), sum(distinct price)\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.OPTION(() => this.CONSUME(Distinct));\n\t\t\t\t\tthis.SUBRULE(this.exprList);\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t/**\n\t * expr_list = expr { \",\" expr } ;\n\t */\n\tprivate exprList = this.RULE('exprList', () => {\n\t\tthis.SUBRULE(this.expression);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Comma);\n\t\t\tthis.SUBRULE2(this.expression);\n\t\t});\n\t});\n\n\t/**\n\t * value_list = expr { \",\" expr } ;\n\t */\n\tprivate valueList = this.RULE('valueList', () => {\n\t\tthis.SUBRULE(this.expression);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Comma);\n\t\t\tthis.SUBRULE2(this.expression);\n\t\t});\n\t});\n\n\t// ============================================================\n\t// LITERALS & IDENTIFIERS\n\t// ============================================================\n\n\t/**\n\t * literal = STRING | NUMBER | \"true\" | \"false\" | \"null\" ;\n\t */\n\tprivate literal = this.RULE('literal', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(StringLiteral) },\n\t\t\t{ ALT: () => this.CONSUME(NumberLiteral) },\n\t\t\t{ ALT: () => this.CONSUME(True) },\n\t\t\t{ ALT: () => this.CONSUME(False) },\n\t\t\t{ ALT: () => this.CONSUME(Null) },\n\t\t\t// Note: Range literals are NOT here - they only appear after range operators\n\t\t\t// (overlaps, contains, containedBy) via rangeOpSuffix rule\n\t\t]);\n\t});\n\n\t/**\n\t * range_literal = ( \"[\" | \"(\" ) range_value \",\" range_value ( \"]\" | \")\" ) ;\n\t * range_value = RANGE_VALUE | NUMBER | \"-\" NUMBER ;\n\t *\n\t * PostgreSQL-style range bounds (full support):\n\t * - Opening: [ (inclusive) or ( (exclusive)\n\t * - Closing: ] (inclusive) or ) (exclusive)\n\t * Examples: [1,10], (0,100), [1,10), (0,10]\n\t *\n\t * Note: This is only called from rangeOpSuffix (after overlaps/contains/containedBy),\n\t * so there's no ambiguity with grouped expressions like (a + b).\n\t */\n\tprivate rangeLiteral = this.RULE('rangeLiteral', () => {\n\t\t// Opening: [ (inclusive) or ( (exclusive)\n\t\tthis.OR1([\n\t\t\t{ ALT: () => this.CONSUME(LBracket) },\n\t\t\t{ ALT: () => this.CONSUME(LParen) },\n\t\t]);\n\t\tthis.SUBRULE(this.rangeValue, { LABEL: 'lower' });\n\t\tthis.CONSUME(Comma);\n\t\tthis.SUBRULE2(this.rangeValue, { LABEL: 'upper' });\n\t\t// Closing: ] (inclusive) or ) (exclusive)\n\t\tthis.OR2([\n\t\t\t{ ALT: () => this.CONSUME(RBracket) },\n\t\t\t{ ALT: () => this.CONSUME(RParen) },\n\t\t]);\n\t});\n\n\t/**\n\t * range_value = RANGE_VALUE | NUMBER | \"-\" NUMBER ;\n\t * RANGE_VALUE matches date/time patterns (2024-01-01, 08:00)\n\t * NUMBER matches plain integers\n\t */\n\tprivate rangeValue = this.RULE('rangeValue', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(RangeValue) },\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.OPTION(() => this.CONSUME(Minus));\n\t\t\t\t\tthis.CONSUME(NumberLiteral);\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t/**\n\t * ident_segment = IDENT | QUOTED_IDENT ;\n\t */\n\tprivate identSegment = this.RULE('identSegment', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(Identifier) },\n\t\t\t{ ALT: () => this.CONSUME(QuotedIdentifier) },\n\t\t\t// Pseudo-column keywords can appear in paths\n\t\t\t// If quoted (\"parent\"), they're real columns, not pseudo-columns\n\t\t\t{ ALT: () => this.CONSUME(Parent) },\n\t\t\t{ ALT: () => this.CONSUME(Child) },\n\t\t\t{ ALT: () => this.CONSUME(Ascendant) },\n\t\t\t{ ALT: () => this.CONSUME(Descendant) },\n\t\t]);\n\t});\n\n\t// ============================================================\n\t// MUTATIONS\n\t// ============================================================\n\n\t/**\n\t * mutation_pipeline = mutation { \"|\" mutation_clause } ;\n\t */\n\tprivate mutationPipeline = this.RULE('mutationPipeline', () => {\n\t\tthis.SUBRULE(this.mutation);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Pipe);\n\t\t\tthis.SUBRULE(this.mutationClause);\n\t\t});\n\t});\n\n\t/**\n\t * mutation_clause = select_clause | bind_clause ;\n\t */\n\tprivate mutationClause = this.RULE('mutationClause', () => {\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.SUBRULE(this.selectClause) },\n\t\t\t{ ALT: () => this.SUBRULE(this.bindClause) },\n\t\t]);\n\t});\n\n\t/**\n\t * bind_clause = \"bind\" IDENT ;\n\t */\n\tprivate bindClause = this.RULE('bindClause', () => {\n\t\tthis.CONSUME(Bind);\n\t\tthis.SUBRULE(this.identSegment);\n\t});\n\n\t/**\n\t * set_clause = set_op [ \"all\" ] set_operand ;\n\t * set_op = \"union\" | \"intersect\" | \"except\" ;\n\t * set_operand = \"(\" query \")\" | ident_segment ;\n\t */\n\tprivate setClause = this.RULE('setClause', () => {\n\t\t// Set operation keyword\n\t\tthis.OR([\n\t\t\t{ ALT: () => this.CONSUME(Union) },\n\t\t\t{ ALT: () => this.CONSUME(Intersect) },\n\t\t\t{ ALT: () => this.CONSUME(Except) },\n\t\t]);\n\t\t// Optional ALL\n\t\tthis.OPTION(() => {\n\t\t\tthis.CONSUME(All);\n\t\t});\n\t\t// Right operand: parenthesized query or bound name\n\t\tthis.OR2([\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.CONSUME(LParen);\n\t\t\t\t\tthis.SUBRULE(this.query);\n\t\t\t\t\tthis.CONSUME(RParen);\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ ALT: () => this.SUBRULE(this.identSegment) },\n\t\t]);\n\t});\n\n\t/**\n\t * mutation = insert_from_stmt | insert_stmt | update_stmt | delete_stmt | upsert_stmt ;\n\t * Note: insert_from_stmt must come before insert_stmt because both start with \"insert into\".\n\t * We use BACKTRACK to resolve the ambiguity.\n\t */\n\tprivate mutation = this.RULE('mutation', () => {\n\t\tthis.OR([\n\t\t\t// BACKTRACK for INSERT FROM (insert into X from Y) vs INSERT SET (insert into X set ...)\n\t\t\t{\n\t\t\t\tALT: () => this.SUBRULE(this.insertFromStmt),\n\t\t\t\tGATE: this.BACKTRACK(this.insertFromStmt),\n\t\t\t},\n\t\t\t{ ALT: () => this.SUBRULE(this.insertStmt) },\n\t\t\t{ ALT: () => this.SUBRULE(this.updateStmt) },\n\t\t\t{ ALT: () => this.SUBRULE(this.deleteStmt) },\n\t\t\t// BACKTRACK for UPSERT FROM (upsert into X on Y from Z) vs UPSERT SET (upsert into X on Y set ...)\n\t\t\t{\n\t\t\t\tALT: () => this.SUBRULE(this.upsertFromStmt),\n\t\t\t\tGATE: this.BACKTRACK(this.upsertFromStmt),\n\t\t\t},\n\t\t\t{ ALT: () => this.SUBRULE(this.upsertStmt) },\n\t\t]);\n\t});\n\n\t/**\n\t * insert_stmt = \"insert\" \"into\" ident_segment \"set\" assignment_list ;\n\t */\n\tprivate insertStmt = this.RULE('insertStmt', () => {\n\t\tthis.CONSUME(Insert);\n\t\tthis.CONSUME(Into);\n\t\tthis.SUBRULE(this.identSegment);\n\t\tthis.OR([\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\t// NQL style: set a=1 | set b=2\n\t\t\t\t\tthis.CONSUME(SetKeyword);\n\t\t\t\t\tthis.SUBRULE(this.assignmentList);\n\t\t\t\t\t// Additional rows via | set (requires GATE to disambiguate from mutation pipeline's | select/bind)\n\t\t\t\t\tthis.MANY({\n\t\t\t\t\t\tGATE: () => {\n\t\t\t\t\t\t\t// Look ahead: we need Pipe followed by SetKeyword\n\t\t\t\t\t\t\tconst tokens = this.LA(1);\n\t\t\t\t\t\t\tconst nextToken = this.LA(2);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\ttokens.tokenType === Pipe && nextToken.tokenType === SetKeyword\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tDEF: () => {\n\t\t\t\t\t\t\tthis.CONSUME(Pipe);\n\t\t\t\t\t\t\tthis.CONSUME2(SetKeyword);\n\t\t\t\t\t\t\tthis.SUBRULE2(this.assignmentList);\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\t// SQL style: values (a=1, b=2), (c=3, d=4)\n\t\t\t\t\tthis.CONSUME(Values);\n\t\t\t\t\tthis.SUBRULE(this.valuesTuple);\n\t\t\t\t\tthis.MANY2(() => {\n\t\t\t\t\t\tthis.CONSUME2(Comma);\n\t\t\t\t\t\tthis.SUBRULE2(this.valuesTuple);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t});\n\n\t/**\n\t * insert_from_stmt = \"insert\" \"into\" ident_segment \"from\" ident_segment [ \"where\" boolean_expr ] [ \"limit\" number ] ;\n\t * @example insert into archived_users from users where active = false limit 100\n\t */\n\tprivate insertFromStmt = this.RULE('insertFromStmt', () => {\n\t\tthis.CONSUME(Insert);\n\t\tthis.CONSUME(Into);\n\t\tthis.SUBRULE(this.identSegment); // target table\n\t\tthis.CONSUME(From);\n\t\tthis.SUBRULE2(this.identSegment); // source table\n\t\tthis.OPTION(() => {\n\t\t\tthis.CONSUME(Where);\n\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t});\n\t\tthis.OPTION2(() => {\n\t\t\tthis.CONSUME(Limit);\n\t\t\tthis.CONSUME(NumberLiteral);\n\t\t});\n\t});\n\n\t/**\n\t * update_stmt = \"update\" ident_segment \"set\" assignment_list [ \"where\" boolean_expr ] ;\n\t */\n\tprivate updateStmt = this.RULE('updateStmt', () => {\n\t\tthis.CONSUME(Update);\n\t\tthis.SUBRULE(this.identSegment);\n\t\tthis.CONSUME(SetKeyword);\n\t\tthis.SUBRULE(this.assignmentList);\n\t\tthis.OPTION(() => {\n\t\t\tthis.CONSUME(Where);\n\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t});\n\t});\n\n\t/**\n\t * delete_stmt = \"delete\" \"from\" ident_segment [ \"where\" boolean_expr ] ;\n\t * Note: WHERE is checked at semantic layer (to allow proper error messages)\n\t */\n\tprivate deleteStmt = this.RULE('deleteStmt', () => {\n\t\tthis.CONSUME(Delete);\n\t\tthis.CONSUME(From);\n\t\tthis.SUBRULE(this.identSegment);\n\t\tthis.OPTION(() => {\n\t\t\tthis.CONSUME(Where);\n\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t});\n\t});\n\n\t/**\n\t * upsert_stmt = \"upsert\" \"into\" ident_segment \"on\" ( \"(\" ident_list \")\" | ident_segment ) \"set\" assignment_list [ \"where\" boolean_expr ] ;\n\t * Allows both `on (id1, id2)` and `on id` syntax\n\t */\n\tprivate upsertStmt = this.RULE('upsertStmt', () => {\n\t\tthis.CONSUME(Upsert);\n\t\tthis.CONSUME(Into);\n\t\tthis.SUBRULE(this.identSegment);\n\t\tthis.CONSUME(On);\n\t\tthis.OR([\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.CONSUME(LParen);\n\t\t\t\t\tthis.SUBRULE(this.identList);\n\t\t\t\t\tthis.CONSUME(RParen);\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.SUBRULE2(this.identSegment);\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t\tthis.CONSUME(SetKeyword);\n\t\tthis.SUBRULE(this.assignmentList);\n\t\tthis.OPTION(() => {\n\t\t\tthis.CONSUME(Where);\n\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t});\n\t});\n\n\t/**\n\t * upsert_from_stmt = \"upsert\" \"into\" ident_segment \"on\" ( \"(\" ident_list \")\" | ident_segment ) \"from\" ident_segment [ \"where\" boolean_expr ] [ \"limit\" number ] ;\n\t * @example upsert into authors on id from counts\n\t * @example upsert into authors on (id, email) from counts where active = true\n\t */\n\tprivate upsertFromStmt = this.RULE('upsertFromStmt', () => {\n\t\tthis.CONSUME(Upsert);\n\t\tthis.CONSUME(Into);\n\t\tthis.SUBRULE(this.identSegment); // target table\n\t\tthis.CONSUME(On);\n\t\tthis.OR([\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.CONSUME(LParen);\n\t\t\t\t\tthis.SUBRULE(this.identList);\n\t\t\t\t\tthis.CONSUME(RParen);\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tALT: () => {\n\t\t\t\t\tthis.SUBRULE2(this.identSegment); // single conflict column\n\t\t\t\t},\n\t\t\t},\n\t\t]);\n\t\tthis.CONSUME(From);\n\t\tthis.SUBRULE3(this.identSegment); // source table\n\t\tthis.OPTION(() => {\n\t\t\tthis.CONSUME(Where);\n\t\t\tthis.SUBRULE(this.booleanExpr);\n\t\t});\n\t\tthis.OPTION2(() => {\n\t\t\tthis.CONSUME(Limit);\n\t\t\tthis.CONSUME(NumberLiteral);\n\t\t});\n\t});\n\n\t/**\n\t * assignment_list = assignment { \",\" assignment } ;\n\t */\n\tprivate assignmentList = this.RULE('assignmentList', () => {\n\t\tthis.SUBRULE(this.assignment);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Comma);\n\t\t\tthis.SUBRULE2(this.assignment);\n\t\t});\n\t});\n\n\t/**\n\t * SQL-style values tuple: (col1=val1, col2=val2)\n\t */\n\tprivate valuesTuple = this.RULE('valuesTuple', () => {\n\t\tthis.CONSUME(LParen);\n\t\tthis.SUBRULE(this.assignmentList);\n\t\tthis.CONSUME(RParen);\n\t});\n\n\t/**\n\t * assignment = ident_segment \"=\" expr ;\n\t */\n\tprivate assignment = this.RULE('assignment', () => {\n\t\tthis.SUBRULE(this.identSegment);\n\t\tthis.CONSUME(Equals);\n\t\tthis.SUBRULE(this.expression);\n\t});\n\n\t/**\n\t * ident_list = ident_segment { \",\" ident_segment } ;\n\t */\n\tprivate identList = this.RULE('identList', () => {\n\t\tthis.SUBRULE(this.identSegment);\n\t\tthis.MANY(() => {\n\t\t\tthis.CONSUME(Comma);\n\t\t\tthis.SUBRULE2(this.identSegment);\n\t\t});\n\t});\n}\n\n// Singleton parser instance\nexport const nqlParser = new NqlParser();\n\n/**\n * Parse NQL input and return CST\n */\nexport function parseCst(input: string): {\n\tcst: CstNode | undefined;\n\terrors: Array<{ message: string; token?: IToken }>;\n} {\n\tconst lexResult = NqlLexer.tokenize(input);\n\n\tif (lexResult.errors.length > 0) {\n\t\treturn {\n\t\t\tcst: undefined,\n\t\t\terrors: lexResult.errors.map((e) => ({\n\t\t\t\tmessage: e.message,\n\t\t\t})),\n\t\t};\n\t}\n\n\tnqlParser.input = lexResult.tokens;\n\tconst cst = nqlParser.program();\n\n\treturn {\n\t\tcst,\n\t\terrors: nqlParser.errors.map((e) => ({\n\t\t\tmessage: e.message,\n\t\t\ttoken: e.token,\n\t\t})),\n\t};\n}\n","// @ts-nocheck — Chevrotain CST visitor helpers\n/**\n * @module semantic/helpers\n * Shared types and utility functions for NQL CST-to-AST visitor.\n */\n\nimport type { CstNode, IToken } from 'chevrotain';\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/index.js';\n\n/** CST context type — values are arrays of CstNode or IToken */\nexport type CstContext = Record<string, (CstNode | IToken)[] | undefined>;\n\n/** Visitor dispatch function — calls this.visit() on a CstNode */\n// biome-ignore lint/suspicious/noExplicitAny: Chevrotain BaseCstVisitor.visit() returns any\nexport type VisitFn = (node: CstNode) => any;\n\n/** Type guard to check if value is a CstNode (has children property) */\nfunction isCstNode(value: CstNode | IToken): value is CstNode {\n\treturn 'children' in value;\n}\n\n/** Safely extract CstNode from context array */\nexport function asCstNode(value: CstNode | IToken): CstNode {\n\t/* v8 ignore start — defensive: Chevrotain parser guarantees CstNode at call sites -- @preserve */\n\tif (!isCstNode(value)) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_UNREACHABLE,\n\t\t\t`Expected CstNode but got IToken: ${(value as IToken).image}`,\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\treturn value;\n}\n\n/** Get token image */\nexport function getImage(value: CstNode | IToken): string {\n\t/* v8 ignore start — defensive: callers always pass IToken -- @preserve */\n\tif (isCstNode(value)) {\n\t\tunreachable('Expected IToken but got CstNode');\n\t}\n\t/* v8 ignore stop -- @preserve */\n\treturn (value as IToken).image;\n}\n\n/** Guard: require a context field to be present, return first element */\nexport function requireFirst(\n\tctx: CstContext,\n\tfield: string,\n\tmessage: string,\n): CstNode | IToken {\n\tconst arr = ctx[field];\n\tif (!arr?.[0]) {\n\t\tthrow new NqlSemanticException(NqlErrorCodes.SEM_INVALID_SYNTAX, message);\n\t}\n\treturn arr[0];\n}\n\n/** Guard: require multiple context fields to be present */\nexport function requireFields(\n\tctx: CstContext,\n\tfields: string[],\n\tmessage: string,\n): void {\n\tfor (const field of fields) {\n\t\tif (!ctx[field]) {\n\t\t\tthrow new NqlSemanticException(NqlErrorCodes.SEM_INVALID_SYNTAX, message);\n\t\t}\n\t}\n}\n\n/** Shorthand for unreachable code paths in exhaustive if-else chains */\nexport function unreachable(message: string): never {\n\tthrow new NqlSemanticException(NqlErrorCodes.SEM_UNREACHABLE, message);\n}\n\n/**\n * Window specification returned by windowClause visitor\n */\nexport interface WindowSpec {\n\tpartitionBy: NqlExpression[];\n\torderBy: NqlOrderItem[];\n}\n\n// Re-import for WindowSpec typing\nimport type { NqlExpression, NqlOrderItem } from '../parser/ast.js';\n","// @ts-nocheck — Chevrotain CST visitor: ctx.rule properties guaranteed present\n/* biome-ignore-all lint/style/noNonNullAssertion: Chevrotain CST access */\n/**\n * @module semantic/visit-cte\n * CTE / WITH clause visitors: withQuery, cteList, cteItem.\n */\n\nimport type { NqlCteItem, NqlQuery, NqlWithQuery } from '../parser/ast.js';\nimport type { CstContext, VisitFn } from './helpers.js';\nimport { asCstNode, requireFirst } from './helpers.js';\n\nexport function visitWithQuery(ctx: CstContext, visit: VisitFn): NqlWithQuery {\n\trequireFirst(ctx, 'cteList', 'WITH query missing CTE list');\n\trequireFirst(ctx, 'query', 'WITH query missing main query');\n\n\tconst ctes: NqlCteItem[] = visit(asCstNode(ctx.cteList[0]!));\n\tconst query: NqlQuery = visit(asCstNode(ctx.query[0]!));\n\n\treturn { type: 'withQuery', ctes, query };\n}\n\nexport function visitCteList(ctx: CstContext, visit: VisitFn): NqlCteItem[] {\n\trequireFirst(ctx, 'cteItem', 'CTE list missing at least one CTE item');\n\n\tconst items: NqlCteItem[] = [];\n\tfor (const itemCtx of ctx.cteItem) {\n\t\titems.push(visit(asCstNode(itemCtx)));\n\t}\n\treturn items;\n}\n\nexport function visitCteItem(ctx: CstContext, visit: VisitFn): NqlCteItem {\n\trequireFirst(ctx, 'identSegment', 'CTE item missing name');\n\trequireFirst(ctx, 'query', 'CTE item missing query body');\n\n\tconst name: string = visit(asCstNode(ctx.identSegment[0]!)) as string;\n\tconst query: NqlQuery = visit(asCstNode(ctx.query[0]!));\n\n\treturn { type: 'cteItem', name, query };\n}\n","// @ts-nocheck — Chevrotain CST visitor: ctx.rule properties guaranteed present\n/* biome-ignore-all lint/style/noNonNullAssertion: Chevrotain CST access requires non-null assertions on ctx.rule[0] patterns */\n/**\n * @module semantic/visit-expression\n * Boolean expressions, arithmetic, primary, case, scalar subquery, relation filters.\n */\n\nimport type { CstNode, IToken } from 'chevrotain';\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/index.js';\nimport type { NqlWarning } from '../errors/types.js';\nimport type {\n\tNqlAnyExpression,\n\tNqlBetweenExpression,\n\tNqlCaseExpression,\n\tNqlExistsExpression,\n\tNqlExpression,\n\tNqlInExpression,\n\tNqlIsNullExpression,\n\tNqlJsonAccessExpression,\n\tNqlJsonComparisonExpression,\n\tNqlLiteral,\n\tNqlPathExpression,\n\tNqlRangeLiteral,\n\tNqlRangeOpExpression,\n\tNqlRelationFilterExpression,\n\tNqlSubquery,\n} from '../parser/ast.js';\nimport type { CstContext, VisitFn } from './helpers.js';\nimport { asCstNode, getImage, requireFirst, unreachable } from './helpers.js';\n\n// ============================================================\n// BOOLEAN EXPRESSIONS\n// ============================================================\n\nexport function visitBooleanExpr(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExpression {\n\trequireFirst(ctx, 'orExpr', 'Boolean expr missing orExpr');\n\treturn visit(asCstNode(ctx.orExpr[0]!));\n}\n\nexport function visitOrExpr(ctx: CstContext, visit: VisitFn): NqlExpression {\n\trequireFirst(ctx, 'andExpr', 'Or expr missing andExpr');\n\tlet left = visit(asCstNode(ctx.andExpr[0]!));\n\tif (ctx.andExpr.length > 1) {\n\t\tfor (let i = 1; i < ctx.andExpr.length; i++) {\n\t\t\tconst right = visit(asCstNode(ctx.andExpr[i]!));\n\t\t\tleft = { type: 'binary', operator: 'or', left, right };\n\t\t}\n\t}\n\treturn left;\n}\n\nexport function visitAndExpr(ctx: CstContext, visit: VisitFn): NqlExpression {\n\trequireFirst(ctx, 'notExpr', 'And expr missing notExpr');\n\tlet left = visit(asCstNode(ctx.notExpr[0]!));\n\tif (ctx.notExpr.length > 1) {\n\t\tfor (let i = 1; i < ctx.notExpr.length; i++) {\n\t\t\tconst right = visit(asCstNode(ctx.notExpr[i]!));\n\t\t\tleft = { type: 'binary', operator: 'and', left, right };\n\t\t}\n\t}\n\treturn left;\n}\n\nexport function visitNotExpr(ctx: CstContext, visit: VisitFn): NqlExpression {\n\trequireFirst(ctx, 'primaryCond', 'Not expr missing primaryCond');\n\tconst expr = visit(asCstNode(ctx.primaryCond[0]!));\n\tif (ctx.Not) {\n\t\treturn { type: 'unary', operator: 'not', operand: expr };\n\t}\n\treturn expr;\n}\n\nexport function visitPrimaryCond(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExpression {\n\tif (ctx.booleanExpr) {\n\t\treturn visit(asCstNode(ctx.booleanExpr[0]!));\n\t}\n\tif (ctx.existsCheck) {\n\t\treturn visit(asCstNode(ctx.existsCheck[0]!));\n\t}\n\tif (ctx.quantifiedRelationFilter) {\n\t\treturn visit(asCstNode(ctx.quantifiedRelationFilter[0]!));\n\t}\n\tif (ctx.allRelationFilter) {\n\t\treturn visit(asCstNode(ctx.allRelationFilter[0]!));\n\t}\n\n\trequireFirst(ctx, 'expression', 'PrimaryCond missing expression');\n\tconst left = visit(asCstNode(ctx.expression[0]!));\n\n\tif (ctx.comparisonSuffix) {\n\t\treturn buildComparison(left, asCstNode(ctx.comparisonSuffix[0]!), visit);\n\t}\n\tif (ctx.betweenSuffix) {\n\t\treturn buildBetween(left, asCstNode(ctx.betweenSuffix[0]!), visit);\n\t}\n\tif (ctx.anySuffix) {\n\t\treturn buildAny(left, asCstNode(ctx.anySuffix[0]!));\n\t}\n\tif (ctx.inSuffix) {\n\t\treturn buildIn(left, asCstNode(ctx.inSuffix[0]!), visit);\n\t}\n\tif (ctx.isNullSuffix) {\n\t\treturn buildIsNull(left, asCstNode(ctx.isNullSuffix[0]!));\n\t}\n\tif (ctx.rangeOpSuffix) {\n\t\treturn buildRangeOp(left, asCstNode(ctx.rangeOpSuffix[0]!), visit);\n\t}\n\tif (ctx.jsonComparisonSuffix) {\n\t\treturn buildJsonComparison(\n\t\t\tleft,\n\t\t\tasCstNode(ctx.jsonComparisonSuffix[0]!),\n\t\t\tvisit,\n\t\t);\n\t}\n\n\treturn left;\n}\n\nfunction buildComparison(\n\tleft: NqlExpression,\n\tsuffixNode: CstNode,\n\tvisit: VisitFn,\n): NqlExpression {\n\tconst suffixCtx = suffixNode.children as CstContext;\n\t/* v8 ignore start — defensive: parser guarantees compOp + expression in comparisonSuffix -- @preserve */\n\tif (!suffixCtx.compOp || !suffixCtx.expression) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Comparison suffix missing operator or expression',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tconst operator = visit(asCstNode(suffixCtx.compOp[0]!)) as\n\t\t| '='\n\t\t| '!='\n\t\t| '<'\n\t\t| '>'\n\t\t| '<='\n\t\t| '>='\n\t\t| 'like';\n\tconst right = visit(asCstNode(suffixCtx.expression[0]!));\n\treturn { type: 'comparison', operator, left, right };\n}\n\nfunction buildBetween(\n\tleft: NqlExpression,\n\tsuffixNode: CstNode,\n\tvisit: VisitFn,\n): NqlBetweenExpression {\n\tconst suffixCtx = suffixNode.children as CstContext;\n\t/* v8 ignore start — defensive: parser guarantees two expressions in betweenSuffix -- @preserve */\n\tif (!suffixCtx.expression || suffixCtx.expression.length < 2) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Between suffix missing expressions',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\treturn {\n\t\ttype: 'between',\n\t\texpression: left,\n\t\tlow: visit(asCstNode(suffixCtx.expression[0]!)),\n\t\thigh: visit(asCstNode(suffixCtx.expression[1]!)),\n\t};\n}\n\nfunction buildIn(\n\tleft: NqlExpression,\n\tsuffixNode: CstNode,\n\tvisit: VisitFn,\n): NqlInExpression {\n\tconst suffixCtx = suffixNode.children as CstContext;\n\tconst negated = !!suffixCtx.Not;\n\n\tif (suffixCtx.StringLiteral) {\n\t\tconst raw = getImage(suffixCtx.StringLiteral[0]!);\n\t\tconst value = raw.slice(1, -1).replace(/''/g, \"'\");\n\t\treturn {\n\t\t\ttype: 'in',\n\t\t\tnegated,\n\t\t\texpression: left,\n\t\t\tvalues: { type: 'dateRange', value },\n\t\t};\n\t}\n\n\tif (suffixCtx.scalarSubquery) {\n\t\treturn {\n\t\t\ttype: 'in',\n\t\t\tnegated,\n\t\t\texpression: left,\n\t\t\tvalues: visit(asCstNode(suffixCtx.scalarSubquery[0]!)),\n\t\t};\n\t}\n\n\tconst values: NqlExpression[] = [];\n\tif (suffixCtx.valueList) {\n\t\tconst listValues = visit(\n\t\t\tasCstNode(suffixCtx.valueList[0]!),\n\t\t) as NqlExpression[];\n\t\tvalues.push(...listValues);\n\t}\n\n\treturn { type: 'in', negated, expression: left, values };\n}\n\n/**\n * BATCH-001: Build NqlAnyExpression from an anySuffix CST node.\n * Handles: left = ANY(:paramName)\n */\nfunction buildAny(left: NqlExpression, suffixNode: CstNode): NqlAnyExpression {\n\tconst suffixCtx = suffixNode.children as CstContext;\n\t// NamedParam token image is ':paramName' — strip the leading ':'\n\tconst paramToken = suffixCtx.NamedParam?.[0];\n\tconst raw = paramToken ? getImage(paramToken) : ':unknown';\n\tconst paramName = raw.slice(1); // remove leading ':'\n\treturn {\n\t\ttype: 'any',\n\t\tcolumn: left,\n\t\tparamName,\n\t};\n}\n\nfunction buildIsNull(\n\tleft: NqlExpression,\n\tsuffixNode: CstNode,\n): NqlIsNullExpression {\n\tconst suffixCtx = suffixNode.children as CstContext;\n\treturn {\n\t\ttype: 'isNull',\n\t\texpression: left,\n\t\tnegated: !!suffixCtx.Not,\n\t};\n}\n\nfunction buildRangeOp(\n\tleft: NqlExpression,\n\tsuffixNode: CstNode,\n\tvisit: VisitFn,\n): NqlRangeOpExpression {\n\tconst suffixCtx = suffixNode.children as CstContext;\n\t/* v8 ignore start — defensive: parser guarantees rangeOp in rangeOpSuffix -- @preserve */\n\tif (!suffixCtx.rangeOp) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Range op suffix missing operator',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tconst operator = visit(asCstNode(suffixCtx.rangeOp[0]!)) as\n\t\t| 'overlaps'\n\t\t| 'contains'\n\t\t| 'containedBy';\n\n\tif (suffixCtx.rangeLiteral) {\n\t\tconst range = visit(\n\t\t\tasCstNode(suffixCtx.rangeLiteral[0]!),\n\t\t) as NqlRangeLiteral;\n\t\treturn { type: 'rangeOp', operator, left, range };\n\t}\n\tif (suffixCtx.literal) {\n\t\tconst scalar = visit(asCstNode(suffixCtx.literal[0]!)) as NqlLiteral;\n\t\treturn { type: 'rangeOp', operator, left, scalar };\n\t}\n\n\t/* v8 ignore start — defensive: parser guarantees rangeLiteral or literal in rangeOpSuffix -- @preserve */\n\tthrow new NqlSemanticException(\n\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t'Range op suffix missing range literal or scalar value',\n\t);\n\t/* v8 ignore stop -- @preserve */\n}\n\nfunction buildJsonComparison(\n\tleft: NqlExpression,\n\tsuffixNode: CstNode,\n\tvisit: VisitFn,\n): NqlJsonComparisonExpression {\n\tconst suffixCtx = suffixNode.children as CstContext;\n\tlet operator: '@>' | '<@' | '?';\n\tif (suffixCtx.JsonContainsOp) operator = '@>';\n\telse if (suffixCtx.JsonContainedByOp) operator = '<@';\n\telse if (suffixCtx.JsonExistsOp) operator = '?';\n\t/* v8 ignore start — defensive: parser guarantees one of the three JSON ops -- @preserve */ else {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'JSON comparison suffix missing operator',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\trequireFirst(\n\t\tsuffixCtx,\n\t\t'expression',\n\t\t'JSON comparison missing right operand',\n\t);\n\tconst right = visit(asCstNode(suffixCtx.expression[0]!));\n\treturn { type: 'jsonComparison', left, operator, right };\n}\n\n// ============================================================\n// JSON ACCESS EXPRESSION\n// ============================================================\n\n/**\n * Visit json_access_expr: base { (\"->\" | \"->>\") key } ...\n * Returns the base expression if no JSON operators, otherwise wraps in NqlJsonAccessExpression.\n */\nexport function visitJsonAccessExpr(\n\tctx: CstContext,\n\tvisit: VisitFn,\n\twarnings?: NqlWarning[],\n): NqlExpression {\n\trequireFirst(ctx, 'primaryExpr', 'jsonAccessExpr missing primaryExpr');\n\tconst base = visit(asCstNode(ctx.primaryExpr[0]!));\n\n\t// Collect JSON access operators and keys\n\tconst hasArrow = ctx.JsonArrow as IToken[] | undefined;\n\tconst hasArrowText = ctx.JsonArrowText as IToken[] | undefined;\n\n\tif (!hasArrow && !hasArrowText) {\n\t\treturn base; // No JSON access — pass through\n\t}\n\n\t// Gather all operators sorted by offset to determine order\n\tconst ops: Array<{ mode: 'json' | 'text'; offset: number }> = [];\n\tif (hasArrow) {\n\t\tfor (const tok of hasArrow) {\n\t\t\tops.push({ mode: 'json', offset: tok.startOffset });\n\t\t}\n\t}\n\tif (hasArrowText) {\n\t\tfor (const tok of hasArrowText) {\n\t\t\tops.push({ mode: 'text', offset: tok.startOffset });\n\t\t}\n\t}\n\tops.sort((a, b) => a.offset - b.offset);\n\n\t// Keys: each operator is followed by a literal\n\tconst literals = ctx.literal as CstNode[];\n\tconst path: string[] = [];\n\tfor (let i = 0; i < literals.length; i++) {\n\t\tconst lit = visit(asCstNode(literals[i]!));\n\t\tif (lit && typeof lit === 'object' && 'value' in lit) {\n\t\t\tpath.push(String(lit.value));\n\t\t} else {\n\t\t\tpath.push(String(lit));\n\t\t}\n\t}\n\n\t// Warn if intermediate ->> is used (only the last operator determines mode)\n\tif (warnings && ops.length > 1) {\n\t\tfor (let i = 0; i < ops.length - 1; i++) {\n\t\t\tif (ops[i]?.mode === 'text') {\n\t\t\t\twarnings.push({\n\t\t\t\t\tcode: 'WARN-JSON-001',\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t'Intermediate ->> operator has no effect; only the last operator determines json/text mode',\n\t\t\t\t\tsuggestion:\n\t\t\t\t\t\t'Use -> for intermediate steps, ->> only for the final extraction',\n\t\t\t\t});\n\t\t\t\tbreak; // one warning per chain is enough\n\t\t\t}\n\t\t}\n\t}\n\n\t// Last operator determines mode\n\tconst lastMode = ops[ops.length - 1]!.mode;\n\n\treturn {\n\t\ttype: 'jsonAccess',\n\t\tbase,\n\t\tpath,\n\t\tmode: lastMode,\n\t} satisfies NqlJsonAccessExpression;\n}\n\n// ============================================================\n// STUB VISITORS (required by Chevrotain but handled elsewhere)\n// ============================================================\n\nexport function visitComparisonSuffix(): NqlExpression {\n\tunreachable('comparisonSuffix should not be visited directly');\n}\n\nexport function visitBetweenSuffix(): NqlExpression {\n\tunreachable('betweenSuffix should not be visited directly');\n}\n\nexport function visitRangeOpSuffix(): NqlExpression {\n\tunreachable('rangeOpSuffix should not be visited directly');\n}\n\nexport function visitJsonComparisonSuffix(): NqlExpression {\n\tunreachable('jsonComparisonSuffix should not be visited directly');\n}\n\nexport function visitInSuffix(): NqlExpression {\n\tunreachable('inSuffix should not be visited directly');\n}\n\nexport function visitIsNullSuffix(): NqlExpression {\n\tunreachable('isNullSuffix should not be visited directly');\n}\n\nexport function visitCompOp(ctx: CstContext): string {\n\tif (ctx.Equals) return '=';\n\tif (ctx.NotEquals) return '!=';\n\tif (ctx.LessThan) return '<';\n\tif (ctx.GreaterThan) return '>';\n\tif (ctx.LessThanOrEqual) return '<=';\n\tif (ctx.GreaterThanOrEqual) return '>=';\n\tif (ctx.Like) return 'like';\n\tunreachable('Unknown comparison operator');\n}\n\nexport function visitRangeOp(\n\tctx: CstContext,\n): 'overlaps' | 'contains' | 'containedBy' {\n\tif (ctx.Overlaps) return 'overlaps';\n\tif (ctx.Contains) return 'contains';\n\tif (ctx.ContainedBy) return 'containedBy';\n\tunreachable('Unknown range operator');\n}\n\n// ============================================================\n// ARITHMETIC EXPRESSIONS\n// ============================================================\n\nexport function visitExpression(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExpression {\n\trequireFirst(ctx, 'addExpr', 'Expression missing addExpr');\n\treturn visit(asCstNode(ctx.addExpr[0]!));\n}\n\nexport function visitAddExpr(ctx: CstContext, visit: VisitFn): NqlExpression {\n\trequireFirst(ctx, 'mulExpr', 'AddExpr missing mulExpr');\n\tlet left = visit(asCstNode(ctx.mulExpr[0]!));\n\n\tif (ctx.mulExpr.length > 1) {\n\t\tconst ops: { op: '+' | '-'; offset: number }[] = [];\n\t\tif (ctx.Plus) {\n\t\t\tfor (const tok of ctx.Plus as IToken[]) {\n\t\t\t\tops.push({ op: '+', offset: tok.startOffset });\n\t\t\t}\n\t\t}\n\t\tif (ctx.Minus) {\n\t\t\tfor (const tok of ctx.Minus as IToken[]) {\n\t\t\t\tops.push({ op: '-', offset: tok.startOffset });\n\t\t\t}\n\t\t}\n\t\tops.sort((a, b) => a.offset - b.offset);\n\n\t\tfor (let i = 1; i < ctx.mulExpr.length; i++) {\n\t\t\tconst right = visit(asCstNode(ctx.mulExpr[i]!));\n\t\t\t/* v8 ignore next — defensive: ops always has i-1 entries for i-1 operators -- @preserve */\n\t\t\tconst op = ops[i - 1]?.op || '+';\n\t\t\tleft = { type: 'binary', operator: op, left, right };\n\t\t}\n\t}\n\n\treturn left;\n}\n\nexport function visitMulExpr(ctx: CstContext, visit: VisitFn): NqlExpression {\n\trequireFirst(ctx, 'unaryExpr', 'MulExpr missing unaryExpr');\n\tlet left = visit(asCstNode(ctx.unaryExpr[0]!));\n\n\tif (ctx.unaryExpr.length > 1) {\n\t\tconst ops: { op: '*' | '/' | '%'; offset: number }[] = [];\n\t\tif (ctx.Star) {\n\t\t\tfor (const tok of ctx.Star as IToken[]) {\n\t\t\t\tops.push({ op: '*', offset: tok.startOffset });\n\t\t\t}\n\t\t}\n\t\tif (ctx.Slash) {\n\t\t\tfor (const tok of ctx.Slash as IToken[]) {\n\t\t\t\tops.push({ op: '/', offset: tok.startOffset });\n\t\t\t}\n\t\t}\n\t\tif (ctx.Percent) {\n\t\t\tfor (const tok of ctx.Percent as IToken[]) {\n\t\t\t\tops.push({ op: '%', offset: tok.startOffset });\n\t\t\t}\n\t\t}\n\t\tops.sort((a, b) => a.offset - b.offset);\n\n\t\tfor (let i = 1; i < ctx.unaryExpr.length; i++) {\n\t\t\tconst right = visit(asCstNode(ctx.unaryExpr[i]!));\n\t\t\t/* v8 ignore next — defensive: ops always has i-1 entries for i-1 operators -- @preserve */\n\t\t\tconst op = ops[i - 1]?.op || '*';\n\t\t\tleft = { type: 'binary', operator: op, left, right };\n\t\t}\n\t}\n\n\treturn left;\n}\n\nexport function visitUnaryExpr(ctx: CstContext, visit: VisitFn): NqlExpression {\n\trequireFirst(ctx, 'jsonAccessExpr', 'UnaryExpr missing jsonAccessExpr');\n\tconst expr = visit(asCstNode(ctx.jsonAccessExpr[0]!));\n\tif (ctx.Minus) {\n\t\treturn { type: 'unary', operator: '-', operand: expr };\n\t}\n\treturn expr;\n}\n\nexport function visitPrimaryExpr(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExpression {\n\tif (ctx.rangeLiteral) return visit(asCstNode(ctx.rangeLiteral[0]!));\n\tif (ctx.literal) return visit(asCstNode(ctx.literal[0]!));\n\tif (ctx.caseExpr) return visit(asCstNode(ctx.caseExpr[0]!));\n\tif (ctx.funcCall) return visit(asCstNode(ctx.funcCall[0]!));\n\tif (ctx.pathExpr) return visit(asCstNode(ctx.pathExpr[0]!));\n\tif (ctx.LParen && ctx.expression) {\n\t\treturn visit(asCstNode(ctx.expression[0]!));\n\t}\n\tif (ctx.scalarSubquery) return visit(asCstNode(ctx.scalarSubquery[0]!));\n\t/* v8 ignore start — defensive: parser guarantees one of the primaryExpr alternatives -- @preserve */\n\tthrow new NqlSemanticException(\n\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t'Invalid primary expression',\n\t);\n\t/* v8 ignore stop -- @preserve */\n}\n\n// ============================================================\n// CASE / SUBQUERY / PATH\n// ============================================================\n\nexport function visitCaseExpr(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlCaseExpression {\n\tconst whenClauses: Array<{\n\t\tcondition: NqlExpression;\n\t\tresult: NqlExpression;\n\t}> = [];\n\tlet subject: NqlExpression | undefined;\n\tconst hasElse = ctx.Else !== undefined;\n\n\tif (ctx.searchedCaseBody) {\n\t\tconst bodyCtx = asCstNode(ctx.searchedCaseBody[0]!).children;\n\t\t/* v8 ignore start — defensive: parser guarantees at least one WHEN clause in CASE body -- @preserve */\n\t\tconst conditions = bodyCtx.booleanExpr ?? [];\n\t\tconst results = bodyCtx.expression ?? [];\n\t\tconst whenCount = bodyCtx.When?.length ?? 0;\n\t\t/* v8 ignore stop -- @preserve */\n\t\tfor (let i = 0; i < whenCount; i++) {\n\t\t\twhenClauses.push({\n\t\t\t\tcondition: visit(asCstNode(conditions[i]!)),\n\t\t\t\tresult: visit(asCstNode(results[i]!)),\n\t\t\t});\n\t\t}\n\t} else if (ctx.simpleCaseBody) {\n\t\tconst bodyCtx = asCstNode(ctx.simpleCaseBody[0]!).children;\n\t\t/* v8 ignore next — defensive: parser guarantees expressions and WHEN in simpleCaseBody -- @preserve */\n\t\tconst expressions = bodyCtx.expression ?? [];\n\t\tconst whenCount = bodyCtx.When?.length ?? 0;\n\t\tsubject = visit(asCstNode(expressions[0]!));\n\t\tfor (let i = 0; i < whenCount; i++) {\n\t\t\twhenClauses.push({\n\t\t\t\tcondition: visit(asCstNode(expressions[1 + i * 2]!)),\n\t\t\t\tresult: visit(asCstNode(expressions[2 + i * 2]!)),\n\t\t\t});\n\t\t}\n\t}\n\n\tconst elseExpressions = ctx.expression ?? [];\n\tif (hasElse && elseExpressions.length > 0) {\n\t\treturn {\n\t\t\ttype: 'case',\n\t\t\t...(subject && { subject }),\n\t\t\twhenClauses,\n\t\t\telseClause: visit(\n\t\t\t\tasCstNode(elseExpressions[elseExpressions.length - 1]!),\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\ttype: 'case',\n\t\t...(subject && { subject }),\n\t\twhenClauses,\n\t};\n}\n\nexport function visitSearchedCaseBody(): void {\n\t/* Handled by caseExpr */\n}\n\nexport function visitSimpleCaseBody(): void {\n\t/* Handled by caseExpr */\n}\n\nexport function visitScalarSubquery(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlSubquery {\n\trequireFirst(ctx, 'query', 'Scalar subquery missing query');\n\treturn {\n\t\ttype: 'subquery',\n\t\tquery: visit(asCstNode(ctx.query[0]!)),\n\t};\n}\n\nexport function visitPathExpr(ctx: CstContext, visit: VisitFn): NqlExpression {\n\tconst segments: string[] = [];\n\tif (ctx.identSegment) {\n\t\tfor (const segCtx of ctx.identSegment) {\n\t\t\tsegments.push(visit(asCstNode(segCtx)));\n\t\t}\n\t}\n\tlet depthHint: number | undefined;\n\tif (ctx.NumberLiteral) {\n\t\tdepthHint = Number.parseInt(getImage(ctx.NumberLiteral[0]!), 10);\n\t}\n\treturn depthHint !== undefined\n\t\t? { type: 'path', segments, depthHint }\n\t\t: { type: 'path', segments };\n}\n\nexport function visitExprList(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExpression[] {\n\tconst expressions: NqlExpression[] = [];\n\tif (ctx.expression) {\n\t\tfor (const exprCtx of ctx.expression) {\n\t\t\texpressions.push(visit(asCstNode(exprCtx)));\n\t\t}\n\t}\n\treturn expressions;\n}\n\n// ============================================================\n// RELATION FILTER EXPRESSIONS (SPEC-002)\n// ============================================================\n\nexport function visitExistsCheck(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExistsExpression {\n\trequireFirst(ctx, 'scalarSubquery', 'Exists missing subquery');\n\treturn {\n\t\ttype: 'exists',\n\t\tnegated: !!ctx.Not,\n\t\tsubquery: visit(asCstNode(ctx.scalarSubquery[0]!)),\n\t};\n}\n\nexport function visitQuantifiedRelationFilter(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlRelationFilterExpression {\n\tlet mode: 'some' | 'none' | 'every';\n\tif (ctx.Some) mode = 'some';\n\telse if (ctx.None) mode = 'none';\n\telse if (ctx.Every) mode = 'every';\n\t/* v8 ignore start — defensive: parser guarantees Some/None/Every token -- @preserve */ else {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'quantifiedRelationFilter missing quantifier',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\trequireFirst(ctx, 'pathExpr', 'quantifiedRelationFilter missing pathExpr');\n\tconst pathExpr = visit(asCstNode(ctx.pathExpr[0]!)) as NqlPathExpression;\n\tconst relation = pathExpr.segments;\n\n\tif (ctx.booleanExpr) {\n\t\tconst alias =\n\t\t\tctx.As && ctx.identSegment\n\t\t\t\t? visit(asCstNode(ctx.identSegment[0]!))\n\t\t\t\t: undefined;\n\t\tconst condition = visit(asCstNode(ctx.booleanExpr[0]!));\n\t\treturn { type: 'relationFilter', relation, condition, mode, alias };\n\t}\n\n\trequireFirst(ctx, 'identSegment', 'quantifiedRelationFilter missing column');\n\tconst column = visit(asCstNode(ctx.identSegment[0]!)) as string;\n\trequireFirst(ctx, 'compOp', 'quantifiedRelationFilter missing compOp');\n\tconst operator = visit(asCstNode(ctx.compOp[0]!)) as string;\n\trequireFirst(\n\t\tctx,\n\t\t'expression',\n\t\t'quantifiedRelationFilter missing expression',\n\t);\n\tconst right = visit(asCstNode(ctx.expression[0]!));\n\n\tconst condition = {\n\t\ttype: 'comparison' as const,\n\t\toperator: operator as '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',\n\t\tleft: { type: 'path' as const, segments: [column] as string[] },\n\t\tright,\n\t};\n\n\treturn { type: 'relationFilter', relation, condition, mode };\n}\n\nexport function visitAllRelationFilter(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlRelationFilterExpression {\n\trequireFirst(ctx, 'pathExpr', 'allRelationFilter missing pathExpr');\n\tconst pathExpr = visit(asCstNode(ctx.pathExpr[0]!)) as NqlPathExpression;\n\tconst segments = pathExpr.segments;\n\n\t/* v8 ignore start — defensive: grammar requires relation.column path (at least 2 segments) -- @preserve */\n\tif (segments.length < 2) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t`allRelationFilter requires at least relation.column (got: ${segments.join('.')})`,\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\tconst relation = segments.slice(0, -1);\n\tconst column = segments[segments.length - 1];\n\n\trequireFirst(ctx, 'compOp', 'allRelationFilter missing compOp');\n\tconst operator = visit(asCstNode(ctx.compOp[0]!)) as string;\n\trequireFirst(ctx, 'expression', 'allRelationFilter missing expression');\n\tconst right = visit(asCstNode(ctx.expression[0]!));\n\n\tconst condition = {\n\t\ttype: 'comparison' as const,\n\t\toperator: operator as '=' | '!=' | '<' | '>' | '<=' | '>=' | 'like',\n\t\tleft: { type: 'path' as const, segments: [column] as string[] },\n\t\tright,\n\t};\n\n\treturn { type: 'relationFilter', relation, condition, mode: 'every' };\n}\n","// @ts-nocheck — Chevrotain CST visitor: ctx.rule properties guaranteed present\n/* biome-ignore-all lint/style/noNonNullAssertion: Chevrotain CST access requires non-null assertions on ctx.rule[0] patterns */\n/**\n * @module semantic/visit-function\n * Function call and window clause visitors for NQL CST-to-AST.\n */\n\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/index.js';\nimport type {\n\tNqlExpression,\n\tNqlFunctionCall,\n\tNqlOrderItem,\n\tNqlWindowExpression,\n} from '../parser/ast.js';\nimport type { CstContext, VisitFn, WindowSpec } from './helpers.js';\nimport { asCstNode } from './helpers.js';\n\nexport function visitFuncCall(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlFunctionCall | NqlWindowExpression {\n\tlet name: string;\n\tif (ctx.RowNumber) name = 'row_number';\n\telse if (ctx.Rank) name = 'rank';\n\telse if (ctx.DenseRank) name = 'dense_rank';\n\telse if (ctx.Lag) name = 'lag';\n\telse if (ctx.Lead) name = 'lead';\n\telse if (ctx.identSegment) name = visit(asCstNode(ctx.identSegment[0]!));\n\t/* v8 ignore start — defensive: parser guarantees a function name token -- @preserve */ else {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Function call missing name',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\tconst args: NqlExpression[] = [];\n\tlet distinct = false;\n\n\tif (ctx.Star) {\n\t\targs.push({ type: 'path', segments: ['*'] });\n\t} else if (ctx.funcArgList) {\n\t\tconst argListCtx = asCstNode(ctx.funcArgList[0]!);\n\t\tif (argListCtx.children?.Distinct) {\n\t\t\tdistinct = true;\n\t\t}\n\t\tconst argList = visit(argListCtx) as NqlExpression[];\n\t\targs.push(...argList);\n\t}\n\n\tif (ctx.windowClause) {\n\t\tconst windowSpec = visit(asCstNode(ctx.windowClause[0]!)) as WindowSpec;\n\t\treturn {\n\t\t\ttype: 'window',\n\t\t\tfunction: name,\n\t\t\targs,\n\t\t\tpartitionBy: windowSpec.partitionBy,\n\t\t\torderBy: windowSpec.orderBy,\n\t\t};\n\t}\n\n\treturn distinct\n\t\t? { type: 'function' as const, name, args, distinct }\n\t\t: { type: 'function' as const, name, args };\n}\n\nexport function visitWindowClause(ctx: CstContext, visit: VisitFn): WindowSpec {\n\tlet partitionBy: NqlExpression[] = [];\n\tlet orderBy: NqlOrderItem[] = [];\n\n\tif (ctx.partitionClause) {\n\t\tpartitionBy = visit(asCstNode(ctx.partitionClause[0]!)) as NqlExpression[];\n\t}\n\n\tif (ctx.orderClauseInWindow) {\n\t\torderBy = visit(asCstNode(ctx.orderClauseInWindow[0]!)) as NqlOrderItem[];\n\t}\n\n\treturn { partitionBy, orderBy };\n}\n\nexport function visitPartitionClause(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExpression[] {\n\tif (ctx.exprList) {\n\t\treturn visit(asCstNode(ctx.exprList[0]!)) as NqlExpression[];\n\t}\n\treturn [];\n}\n\nexport function visitOrderClauseInWindow(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlOrderItem[] {\n\tif (ctx.orderList) {\n\t\treturn visit(asCstNode(ctx.orderList[0]!)) as NqlOrderItem[];\n\t}\n\treturn [];\n}\n\nexport function visitFuncArgList(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlExpression[] {\n\tif (ctx.exprList) {\n\t\treturn visit(asCstNode(ctx.exprList[0]!)) as NqlExpression[];\n\t}\n\treturn [];\n}\n","// @ts-nocheck — Chevrotain CST visitor: ctx.rule properties guaranteed present\n/* biome-ignore-all lint/style/noNonNullAssertion: Chevrotain CST access requires non-null assertions on ctx.rule[0] patterns */\n/**\n * @module semantic/visit-literal\n * Literal, identifier, and value visitors for NQL CST-to-AST.\n */\n\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/index.js';\nimport type { NqlLiteral, NqlRangeLiteral } from '../parser/ast.js';\nimport type { CstContext, VisitFn } from './helpers.js';\nimport { asCstNode, getImage, requireFields, unreachable } from './helpers.js';\n\nexport function visitLiteral(ctx: CstContext, visit: VisitFn): NqlLiteral {\n\tif (ctx.StringLiteral) {\n\t\tconst raw = getImage(ctx.StringLiteral[0]!);\n\t\treturn { type: 'string', value: raw.slice(1, -1).replace(/''/g, \"'\") };\n\t}\n\tif (ctx.NumberLiteral) {\n\t\treturn {\n\t\t\ttype: 'number',\n\t\t\tvalue: parseFloat(getImage(ctx.NumberLiteral[0]!)),\n\t\t};\n\t}\n\tif (ctx.True) {\n\t\treturn { type: 'boolean', value: true };\n\t}\n\tif (ctx.False) {\n\t\treturn { type: 'boolean', value: false };\n\t}\n\tif (ctx.Null) {\n\t\treturn { type: 'null' };\n\t}\n\tif (ctx.rangeLiteral) {\n\t\treturn visit(asCstNode(ctx.rangeLiteral[0]!)) as NqlRangeLiteral;\n\t}\n\t/* v8 ignore next — defensive: parser guarantees one of the literal alternatives -- @preserve */\n\tunreachable('Invalid literal');\n}\n\nexport function visitRangeLiteral(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlRangeLiteral {\n\tconst lowerInclusive = ctx.LBracket !== undefined;\n\tconst upperInclusive = ctx.RBracket !== undefined;\n\n\trequireFields(\n\t\tctx,\n\t\t['lower', 'upper'],\n\t\t'Range literal missing lower or upper bound',\n\t);\n\tconst lower = visit(asCstNode(ctx.lower[0]!)) as string;\n\tconst upper = visit(asCstNode(ctx.upper[0]!)) as string;\n\n\tconst openBracket = lowerInclusive ? '[' : '(';\n\tconst closeBracket = upperInclusive ? ']' : ')';\n\tconst value = `${openBracket}${lower},${upper}${closeBracket}`;\n\n\treturn {\n\t\ttype: 'rangeLiteral',\n\t\tvalue,\n\t\tlowerInclusive,\n\t\tupperInclusive,\n\t\tlower,\n\t\tupper,\n\t};\n}\n\nexport function visitRangeValue(ctx: CstContext): string {\n\tif (ctx.RangeValue) {\n\t\treturn getImage(ctx.RangeValue[0]!);\n\t}\n\tconst numToken = ctx.NumberLiteral;\n\t/* v8 ignore start — defensive: parser guarantees RangeValue or NumberLiteral -- @preserve */\n\tif (!numToken) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Range value must contain RangeValue or NumberLiteral',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tconst minus = ctx.Minus ? '-' : '';\n\tconst num = getImage(numToken[0]!);\n\treturn `${minus}${num}`;\n}\n\nexport function visitIdentSegment(ctx: CstContext): string {\n\tif (ctx.Identifier) {\n\t\treturn getImage(ctx.Identifier[0]!);\n\t}\n\tif (ctx.QuotedIdentifier) {\n\t\tconst raw = getImage(ctx.QuotedIdentifier[0]!);\n\t\treturn raw.slice(1, -1).replace(/\"\"/g, '\"');\n\t}\n\tif (ctx.Parent) return getImage(ctx.Parent[0]!);\n\tif (ctx.Child) return getImage(ctx.Child[0]!);\n\tif (ctx.Ascendant) return getImage(ctx.Ascendant[0]!);\n\tif (ctx.Descendant) return getImage(ctx.Descendant[0]!);\n\t/* v8 ignore start — defensive: parser guarantees one of the identifier alternatives -- @preserve */\n\tthrow new NqlSemanticException(\n\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t'Invalid identifier',\n\t);\n\t/* v8 ignore stop -- @preserve */\n}\n\nexport function visitIdentList(ctx: CstContext, visit: VisitFn): string[] {\n\tconst idents: string[] = [];\n\tif (ctx.identSegment) {\n\t\tfor (const segCtx of ctx.identSegment) {\n\t\t\tidents.push(visit(asCstNode(segCtx)));\n\t\t}\n\t}\n\treturn idents;\n}\n\nexport function visitValueList(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): import('../parser/ast.js').NqlExpression[] {\n\tconst values: import('../parser/ast.js').NqlExpression[] = [];\n\tif (ctx.expression) {\n\t\tfor (const exprCtx of ctx.expression) {\n\t\t\tvalues.push(visit(asCstNode(exprCtx)));\n\t\t}\n\t}\n\treturn values;\n}\n","// @ts-nocheck — Chevrotain CST visitor: ctx.rule properties guaranteed present\n/* biome-ignore-all lint/style/noNonNullAssertion: Chevrotain CST access requires non-null assertions on ctx.rule[0] patterns */\n/**\n * @module semantic/visit-mutation\n * Mutation visitors: insert, update, delete, upsert, assignments.\n */\n\nimport { NqlErrorCodes, NqlSemanticException } from '../errors/index.js';\nimport type {\n\tNqlAssignment,\n\tNqlMutation,\n\tNqlMutationClause,\n\tNqlMutationPipeline,\n} from '../parser/ast.js';\nimport type { CstContext, VisitFn } from './helpers.js';\nimport {\n\tasCstNode,\n\tgetImage,\n\trequireFields,\n\trequireFirst,\n\tunreachable,\n} from './helpers.js';\n\nexport function visitMutationPipeline(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlMutationPipeline {\n\trequireFirst(ctx, 'mutation', 'Mutation pipeline missing mutation');\n\tconst mutation = visit(asCstNode(ctx.mutation[0]!));\n\tconst clauses: NqlMutationClause[] = [];\n\tif (ctx.mutationClause) {\n\t\tfor (const clauseCtx of ctx.mutationClause) {\n\t\t\tclauses.push(visit(asCstNode(clauseCtx)));\n\t\t}\n\t}\n\treturn { type: 'mutationPipeline', mutation, clauses };\n}\n\nexport function visitMutationClause(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlMutationClause {\n\tif (ctx.selectClause) return visit(asCstNode(ctx.selectClause[0]!));\n\tif (ctx.bindClause) return visit(asCstNode(ctx.bindClause[0]!));\n\t/* v8 ignore next — defensive: parser guarantees selectClause or bindClause -- @preserve */\n\tunreachable('Unknown mutation clause');\n}\n\nexport function visitBindClause(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlMutationClause {\n\trequireFirst(ctx, 'identSegment', 'Bind clause missing name');\n\treturn {\n\t\ttype: 'bind',\n\t\tname: visit(asCstNode(ctx.identSegment[0]!)),\n\t};\n}\n\nexport function visitMutation(ctx: CstContext, visit: VisitFn): NqlMutation {\n\tif (ctx.insertFromStmt) return visit(asCstNode(ctx.insertFromStmt[0]!));\n\tif (ctx.insertStmt) return visit(asCstNode(ctx.insertStmt[0]!));\n\tif (ctx.updateStmt) return visit(asCstNode(ctx.updateStmt[0]!));\n\tif (ctx.deleteStmt) return visit(asCstNode(ctx.deleteStmt[0]!));\n\tif (ctx.upsertFromStmt) return visit(asCstNode(ctx.upsertFromStmt[0]!));\n\tif (ctx.upsertStmt) return visit(asCstNode(ctx.upsertStmt[0]!));\n\t/* v8 ignore next — defensive: parser guarantees one of the mutation alternatives -- @preserve */\n\tunreachable('Unknown mutation type');\n}\n\nexport function visitInsertStmt(ctx: CstContext, visit: VisitFn): NqlMutation {\n\trequireFields(ctx, ['identSegment'], 'Insert missing table');\n\tconst table: string = visit(asCstNode(ctx.identSegment[0]!));\n\tconst rows: NqlAssignment[][] = [];\n\n\tif (ctx.assignmentList) {\n\t\tfor (const assignListCtx of ctx.assignmentList) {\n\t\t\tconst assignments: NqlAssignment[] = visit(asCstNode(assignListCtx));\n\t\t\trows.push(assignments);\n\t\t}\n\t}\n\tif (ctx.valuesTuple) {\n\t\tfor (const tupleCtx of ctx.valuesTuple) {\n\t\t\tconst assignments: NqlAssignment[] = visit(asCstNode(tupleCtx));\n\t\t\trows.push(assignments);\n\t\t}\n\t}\n\n\t/* v8 ignore start — defensive: parser guarantees at least one assignmentList or valuesTuple -- @preserve */\n\tif (rows.length === 0) {\n\t\tthrow new Error('Insert statement must have at least one row');\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\treturn { type: 'insert', table, rows };\n}\n\nexport function visitInsertFromStmt(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlMutation {\n\t/* v8 ignore start — defensive: parser guarantees target and source identifiers -- @preserve */\n\tif (!ctx.identSegment || ctx.identSegment.length < 2) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Insert FROM missing target or source table',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tconst target = visit(asCstNode(ctx.identSegment[0]!)) as string;\n\tconst source = visit(asCstNode(ctx.identSegment[1]!)) as string;\n\n\treturn {\n\t\ttype: 'insert_from',\n\t\ttable: target,\n\t\tsource,\n\t\twhere: ctx.booleanExpr ? visit(asCstNode(ctx.booleanExpr[0]!)) : undefined,\n\t\tlimit: ctx.NumberLiteral\n\t\t\t? parseInt(getImage(ctx.NumberLiteral[0]!), 10)\n\t\t\t: undefined,\n\t};\n}\n\nexport function visitUpdateStmt(ctx: CstContext, visit: VisitFn): NqlMutation {\n\trequireFields(\n\t\tctx,\n\t\t['identSegment', 'assignmentList'],\n\t\t'Update missing table or assignments',\n\t);\n\treturn {\n\t\ttype: 'update',\n\t\ttable: visit(asCstNode(ctx.identSegment[0]!)),\n\t\tassignments: visit(asCstNode(ctx.assignmentList[0]!)),\n\t\twhere: ctx.booleanExpr ? visit(asCstNode(ctx.booleanExpr[0]!)) : undefined,\n\t};\n}\n\nexport function visitDeleteStmt(ctx: CstContext, visit: VisitFn): NqlMutation {\n\trequireFirst(ctx, 'identSegment', 'Delete missing table');\n\treturn {\n\t\ttype: 'delete',\n\t\ttable: visit(asCstNode(ctx.identSegment[0]!)),\n\t\twhere: ctx.booleanExpr ? visit(asCstNode(ctx.booleanExpr[0]!)) : undefined,\n\t};\n}\n\nexport function visitUpsertStmt(ctx: CstContext, visit: VisitFn): NqlMutation {\n\trequireFields(\n\t\tctx,\n\t\t['identSegment', 'assignmentList'],\n\t\t'Upsert missing table or assignments',\n\t);\n\n\tconst conflictColumns: string[] = [];\n\tif (ctx.identList) {\n\t\tconst cols = visit(asCstNode(ctx.identList[0]!)) as string[];\n\t\tconflictColumns.push(...cols);\n\t} else if (ctx.identSegment.length > 1) {\n\t\tconflictColumns.push(visit(asCstNode(ctx.identSegment[1]!)));\n\t}\n\n\treturn {\n\t\ttype: 'upsert',\n\t\ttable: visit(asCstNode(ctx.identSegment[0]!)),\n\t\tconflictColumns,\n\t\tassignments: visit(asCstNode(ctx.assignmentList[0]!)),\n\t\twhere: ctx.booleanExpr ? visit(asCstNode(ctx.booleanExpr[0]!)) : undefined,\n\t};\n}\n\nexport function visitUpsertFromStmt(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlMutation {\n\t/* v8 ignore start — defensive: parser guarantees target and source identifiers -- @preserve */\n\tif (!ctx.identSegment || ctx.identSegment.length < 2) {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Upsert FROM missing target or source table',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\tconst conflictColumns: string[] = [];\n\tlet sourceIndex: number;\n\n\tif (ctx.identList) {\n\t\tconst cols = visit(asCstNode(ctx.identList[0]!)) as string[];\n\t\tconflictColumns.push(...cols);\n\t\tsourceIndex = 1;\n\t} else if (ctx.identSegment.length >= 3) {\n\t\tconflictColumns.push(visit(asCstNode(ctx.identSegment[1]!)));\n\t\tsourceIndex = 2;\n\t} /* v8 ignore start — defensive: parser guarantees identList or >= 3 identSegments -- @preserve */ else {\n\t\tthrow new NqlSemanticException(\n\t\t\tNqlErrorCodes.SEM_INVALID_SYNTAX,\n\t\t\t'Upsert FROM missing conflict columns or source table',\n\t\t);\n\t}\n\t/* v8 ignore stop -- @preserve */\n\n\tconst target = visit(asCstNode(ctx.identSegment[0]!)) as string;\n\tconst source = visit(asCstNode(ctx.identSegment[sourceIndex]!)) as string;\n\n\treturn {\n\t\ttype: 'upsert_from',\n\t\ttable: target,\n\t\tconflictColumns,\n\t\tsource,\n\t\twhere: ctx.booleanExpr ? visit(asCstNode(ctx.booleanExpr[0]!)) : undefined,\n\t\tlimit: ctx.NumberLiteral\n\t\t\t? parseInt(getImage(ctx.NumberLiteral[0]!), 10)\n\t\t\t: undefined,\n\t};\n}\n\nexport function visitAssignmentList(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlAssignment[] {\n\tconst assignments: NqlAssignment[] = [];\n\tif (ctx.assignment) {\n\t\tfor (const assignCtx of ctx.assignment) {\n\t\t\tassignments.push(visit(asCstNode(assignCtx)));\n\t\t}\n\t}\n\treturn assignments;\n}\n\nexport function visitValuesTuple(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlAssignment[] {\n\trequireFields(ctx, ['assignmentList'], 'Values tuple missing assignments');\n\treturn visit(asCstNode(ctx.assignmentList[0]!));\n}\n\nexport function visitAssignment(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlAssignment {\n\trequireFields(\n\t\tctx,\n\t\t['identSegment', 'expression'],\n\t\t'Assignment missing column or value',\n\t);\n\treturn {\n\t\tcolumn: visit(asCstNode(ctx.identSegment[0]!)),\n\t\tvalue: visit(asCstNode(ctx.expression[0]!)),\n\t};\n}\n","// @ts-nocheck — Chevrotain CST visitor: ctx.rule properties guaranteed present\n/* biome-ignore-all lint/style/noNonNullAssertion: Chevrotain CST access requires non-null assertions on ctx.rule[0] patterns */\n/**\n * @module semantic/visit-query\n * Query structure visitors: program, statement, query, clauses, select, order, join, params.\n */\n\nimport type {\n\tNqlClause,\n\tNqlExpression,\n\tNqlJoinParam,\n\tNqlJoinSpec,\n\tNqlLockClause,\n\tNqlOrderItem,\n\tNqlProgram,\n\tNqlQuery,\n\tNqlSelectItem,\n\tNqlSetClause,\n\tNqlStatement,\n} from '../parser/ast.js';\nimport type { CstContext, VisitFn } from './helpers.js';\nimport {\n\tasCstNode,\n\tgetImage,\n\trequireFields,\n\trequireFirst,\n\tunreachable,\n} from './helpers.js';\n\nexport function visitProgram(ctx: CstContext, visit: VisitFn): NqlProgram {\n\tconst statements: NqlStatement[] = [];\n\tif (ctx.statement) {\n\t\tfor (const stmtCtx of ctx.statement) {\n\t\t\tstatements.push(visit(asCstNode(stmtCtx)));\n\t\t}\n\t}\n\treturn { type: 'program', statements };\n}\n\nexport function visitStatement(ctx: CstContext, visit: VisitFn): NqlStatement {\n\tif (ctx.withQuery) return visit(asCstNode(ctx.withQuery[0]!));\n\tif (ctx.query) return visit(asCstNode(ctx.query[0]!));\n\tif (ctx.mutationPipeline) return visit(asCstNode(ctx.mutationPipeline[0]!));\n\t/* v8 ignore next — defensive: parser guarantees withQuery, query, or mutationPipeline -- @preserve */\n\tunreachable('Invalid statement');\n}\n\nexport function visitQuery(ctx: CstContext, visit: VisitFn): NqlQuery {\n\trequireFirst(ctx, 'tableRef', 'Query missing table');\n\tconst table = visit(asCstNode(ctx.tableRef[0]!));\n\tconst clauses: NqlClause[] = [];\n\tif (ctx.queryClause) {\n\t\tfor (const clauseCtx of ctx.queryClause) {\n\t\t\tclauses.push(visit(asCstNode(clauseCtx)));\n\t\t}\n\t}\n\treturn { type: 'query', table, clauses };\n}\n\nexport function visitTableRef(ctx: CstContext, visit: VisitFn): string {\n\trequireFirst(ctx, 'identSegment', 'Table ref missing identifier');\n\treturn visit(asCstNode(ctx.identSegment[0]!));\n}\n\nexport function visitQueryClause(ctx: CstContext, visit: VisitFn): NqlClause {\n\tif (ctx.whereClause) return visit(asCstNode(ctx.whereClause[0]!));\n\tif (ctx.selectClause) return visit(asCstNode(ctx.selectClause[0]!));\n\tif (ctx.flatClause) return visit(asCstNode(ctx.flatClause[0]!));\n\tif (ctx.groupClause) return visit(asCstNode(ctx.groupClause[0]!));\n\tif (ctx.orderClause) return visit(asCstNode(ctx.orderClause[0]!));\n\tif (ctx.limitClause) return visit(asCstNode(ctx.limitClause[0]!));\n\tif (ctx.offsetClause) return visit(asCstNode(ctx.offsetClause[0]!));\n\tif (ctx.setClause) return visit(asCstNode(ctx.setClause[0]!));\n\tif (ctx.bindClause) return visit(asCstNode(ctx.bindClause[0]!));\n\tif (ctx.lockClause) return visit(asCstNode(ctx.lockClause[0]!));\n\t/* v8 ignore next — defensive: parser guarantees one of the clause alternatives -- @preserve */\n\tunreachable('Unknown query clause');\n}\n\nexport function visitWhereClause(ctx: CstContext, visit: VisitFn): NqlClause {\n\trequireFirst(ctx, 'booleanExpr', 'Where clause missing expression');\n\treturn {\n\t\ttype: 'where',\n\t\tcondition: visit(asCstNode(ctx.booleanExpr[0]!)),\n\t};\n}\n\nexport function visitSelectClause(ctx: CstContext, visit: VisitFn): NqlClause {\n\tconst distinct = !!ctx.Distinct;\n\tconst items: NqlSelectItem[] = [];\n\tif (ctx.selectList) {\n\t\tconst listItems = visit(asCstNode(ctx.selectList[0]!)) as NqlSelectItem[];\n\t\titems.push(...listItems);\n\t}\n\treturn { type: 'select', distinct, items };\n}\n\nexport function visitFlatClause(): NqlClause {\n\treturn { type: 'flat' };\n}\n\nexport function visitGroupClause(ctx: CstContext, visit: VisitFn): NqlClause {\n\tconst expressions: NqlExpression[] = [];\n\tif (ctx.exprList) {\n\t\tconst exprs = visit(asCstNode(ctx.exprList[0]!)) as NqlExpression[];\n\t\texpressions.push(...exprs);\n\t}\n\treturn { type: 'groupBy', expressions };\n}\n\nexport function visitOrderClause(ctx: CstContext, visit: VisitFn): NqlClause {\n\tconst items: NqlOrderItem[] = [];\n\tif (ctx.orderList) {\n\t\tconst orderItems = visit(asCstNode(ctx.orderList[0]!)) as NqlOrderItem[];\n\t\titems.push(...orderItems);\n\t}\n\treturn { type: 'orderBy', items };\n}\n\nexport function visitLimitClause(ctx: CstContext, visit: VisitFn): NqlClause {\n\trequireFirst(ctx, 'NumberLiteral', 'Limit clause missing number');\n\tconst count = parseInt(getImage(ctx.NumberLiteral[0]!), 10);\n\tconst segments = ctx.identSegment;\n\tif (segments && segments.length > 0) {\n\t\tconst parts: string[] = [];\n\t\tfor (const seg of segments) {\n\t\t\tparts.push(visit(asCstNode(seg)));\n\t\t}\n\t\treturn { type: 'limit', count, relation: parts.join('.') };\n\t}\n\treturn { type: 'limit', count };\n}\n\nexport function visitOffsetClause(ctx: CstContext): NqlClause {\n\trequireFirst(ctx, 'NumberLiteral', 'Offset clause missing number');\n\treturn {\n\t\ttype: 'offset',\n\t\tcount: parseInt(getImage(ctx.NumberLiteral[0]!), 10),\n\t};\n}\n\nexport function visitJoinSpec(ctx: CstContext, visit: VisitFn): NqlJoinSpec {\n\trequireFirst(ctx, 'identSegment', 'Join spec missing relation');\n\tconst relation = visit(asCstNode(ctx.identSegment[0]!));\n\tlet via: string | undefined;\n\tlet condition: NqlExpression | undefined;\n\tlet params: NqlJoinParam[] | undefined;\n\n\tif (ctx.Via && ctx.identSegment.length > 1) {\n\t\tvia = visit(asCstNode(ctx.identSegment[1]!));\n\t}\n\t/* v8 ignore start — not yet reachable: JOIN params not exposed in current grammar -- @preserve */\n\tif (ctx.paramList) {\n\t\tparams = visit(asCstNode(ctx.paramList[0]!));\n\t}\n\t/* v8 ignore stop -- @preserve */\n\tif (ctx.On && ctx.booleanExpr) {\n\t\tcondition = visit(asCstNode(ctx.booleanExpr[0]!));\n\t}\n\n\treturn { relation, via, condition, params };\n}\n\nexport function visitParamList(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlJoinParam[] {\n\tconst params: NqlJoinParam[] = [];\n\tif (ctx.param) {\n\t\tfor (const paramCtx of ctx.param) {\n\t\t\tparams.push(visit(asCstNode(paramCtx)));\n\t\t}\n\t}\n\treturn params;\n}\n\nexport function visitParam(ctx: CstContext, visit: VisitFn): NqlJoinParam {\n\trequireFields(\n\t\tctx,\n\t\t['identSegment', 'literal'],\n\t\t'Param missing name or value',\n\t);\n\treturn {\n\t\tname: visit(asCstNode(ctx.identSegment[0]!)),\n\t\tvalue: visit(asCstNode(ctx.literal[0]!)),\n\t};\n}\n\nexport function visitSelectList(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlSelectItem[] {\n\tconst items: NqlSelectItem[] = [];\n\tif (ctx.selectItem) {\n\t\tfor (const itemCtx of ctx.selectItem) {\n\t\t\titems.push(visit(asCstNode(itemCtx)));\n\t\t}\n\t}\n\treturn items;\n}\n\nexport function visitSelectItem(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlSelectItem {\n\tif (ctx.Star && !ctx.relationStarExpr) {\n\t\treturn { type: 'star' };\n\t}\n\tif (ctx.relationStarExpr) {\n\t\treturn visit(asCstNode(ctx.relationStarExpr[0]!));\n\t}\n\trequireFirst(ctx, 'expression', 'Select item missing expression');\n\tconst expression = visit(asCstNode(ctx.expression[0]!));\n\tconst alias = ctx.identSegment\n\t\t? visit(asCstNode(ctx.identSegment[0]!))\n\t\t: undefined;\n\treturn { type: 'expression', expression, alias };\n}\n\nexport function visitRelationStarExpr(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlSelectItem {\n\tconst segments: string[] = [];\n\tif (ctx.identSegment) {\n\t\tfor (const segCtx of ctx.identSegment) {\n\t\t\tsegments.push(visit(asCstNode(segCtx)));\n\t\t}\n\t}\n\treturn { type: 'relationStar', relation: segments };\n}\n\nexport function visitOrderList(\n\tctx: CstContext,\n\tvisit: VisitFn,\n): NqlOrderItem[] {\n\tconst items: NqlOrderItem[] = [];\n\tif (ctx.orderItem) {\n\t\tfor (const itemCtx of ctx.orderItem) {\n\t\t\titems.push(visit(asCstNode(itemCtx)));\n\t\t}\n\t}\n\treturn items;\n}\n\nexport function visitOrderItem(ctx: CstContext, visit: VisitFn): NqlOrderItem {\n\trequireFirst(ctx, 'expression', 'Order item missing expression');\n\tconst expression = visit(asCstNode(ctx.expression[0]!));\n\tconst direction: 'asc' | 'desc' = ctx.Desc ? 'desc' : 'asc';\n\treturn { expression, direction };\n}\n\nexport function visitLockClause(ctx: CstContext): NqlLockClause {\n\tlet strength: NqlLockClause['strength'];\n\tif (ctx.ForUpdate) strength = 'forUpdate';\n\telse if (ctx.ForShare) strength = 'forShare';\n\telse if (ctx.ForNoKeyUpdate) strength = 'forNoKeyUpdate';\n\telse if (ctx.ForKeyShare) strength = 'forKeyShare';\n\t/* v8 ignore next — defensive: parser guarantees one of the lock strength tokens -- @preserve */ else\n\t\tunreachable('Lock clause missing strength keyword');\n\n\tlet waitPolicy: NqlLockClause['waitPolicy'] = 'block';\n\tif (ctx.SkipLocked) waitPolicy = 'skipLocked';\n\telse if (ctx.NoWait) waitPolicy = 'noWait';\n\n\treturn { type: 'lock', strength, waitPolicy };\n}\n\nexport function visitSetClause(ctx: CstContext, visit: VisitFn): NqlSetClause {\n\t// Determine set operation type from consumed token\n\tlet op: NqlSetClause['op'];\n\tif (ctx.Union) op = 'union';\n\telse if (ctx.Intersect) op = 'intersect';\n\telse if (ctx.Except) op = 'except';\n\t/* v8 ignore next — defensive: parser guarantees Union/Intersect/Except token -- @preserve */ else\n\t\tunreachable('Set clause missing operation keyword');\n\n\tconst all = !!ctx.All;\n\n\t// Right operand: parenthesized query or bound name\n\tif (ctx.query) {\n\t\tconst right: NqlQuery = visit(asCstNode(ctx.query[0]!));\n\t\treturn { type: 'setOperation', op, all, right };\n\t}\n\tif (ctx.identSegment) {\n\t\tconst boundName: string = visit(asCstNode(ctx.identSegment[0]!));\n\t\treturn { type: 'setOperation', op, all, boundName };\n\t}\n\t/* v8 ignore next — defensive: parser guarantees query or identSegment -- @preserve */\n\tunreachable('Set clause missing operand');\n}\n","// @ts-nocheck — Chevrotain CST visitor: ctx.rule properties guaranteed present\n/* biome-ignore-all lint/style/noNonNullAssertion: Chevrotain CST access */\n/**\n * NQL CST-to-AST Visitor (thin dispatcher)\n *\n * Delegates all logic to domain modules in semantic/.\n * Each method is a one-liner that forwards to the corresponding visitX function.\n * Chevrotain's validateVisitor() requires all grammar rule methods on a single class.\n */\n\nimport type { CstNode } from 'chevrotain';\nimport type { NqlWarning } from '../errors/types.js';\nimport type { NqlProgram } from '../parser/ast.js';\nimport { nqlParser } from '../parser/grammar.js';\nimport type { CstContext, VisitFn } from './helpers.js';\n// CTE / WITH clause\nimport { visitCteItem, visitCteList, visitWithQuery } from './visit-cte.js';\n// Boolean, comparison, arithmetic, case, path, relation filters\nimport {\n\tvisitAddExpr,\n\tvisitAllRelationFilter,\n\tvisitAndExpr,\n\tvisitBetweenSuffix,\n\tvisitBooleanExpr,\n\tvisitCaseExpr,\n\tvisitComparisonSuffix,\n\tvisitCompOp,\n\tvisitExistsCheck,\n\tvisitExpression,\n\tvisitExprList,\n\tvisitInSuffix,\n\tvisitIsNullSuffix,\n\tvisitJsonAccessExpr,\n\tvisitJsonComparisonSuffix,\n\tvisitMulExpr,\n\tvisitNotExpr,\n\tvisitOrExpr,\n\tvisitPathExpr,\n\tvisitPrimaryCond,\n\tvisitPrimaryExpr,\n\tvisitQuantifiedRelationFilter,\n\tvisitRangeOp,\n\tvisitRangeOpSuffix,\n\tvisitScalarSubquery,\n\tvisitSearchedCaseBody,\n\tvisitSimpleCaseBody,\n\tvisitUnaryExpr,\n} from './visit-expression.js';\n// Function calls + window\nimport {\n\tvisitFuncArgList,\n\tvisitFuncCall,\n\tvisitOrderClauseInWindow,\n\tvisitPartitionClause,\n\tvisitWindowClause,\n} from './visit-function.js';\n// Literals + identifiers\nimport {\n\tvisitIdentList,\n\tvisitIdentSegment,\n\tvisitLiteral,\n\tvisitRangeLiteral,\n\tvisitRangeValue,\n\tvisitValueList,\n} from './visit-literal.js';\n// Mutations\nimport {\n\tvisitAssignment,\n\tvisitAssignmentList,\n\tvisitBindClause,\n\tvisitDeleteStmt,\n\tvisitInsertFromStmt,\n\tvisitInsertStmt,\n\tvisitMutation,\n\tvisitMutationClause,\n\tvisitMutationPipeline,\n\tvisitUpdateStmt,\n\tvisitUpsertFromStmt,\n\tvisitUpsertStmt,\n\tvisitValuesTuple,\n} from './visit-mutation.js';\n// Query structure\n// Note: visitJoinSpec, visitParamList, visitParam are intentionally NOT imported here.\n// The grammar has no RULE for joinSpec/paramList/param, so the Chevrotain parser\n// never emits CST nodes for them — visitor methods would be permanently dead\n// dispatchers. The visit-query.ts helpers (visitJoinSpec etc.) are kept there\n// for legacy direct-call unit tests; they are eligible for deletion once those\n// tests migrate to grammar-driven inputs. Removed from the dispatcher class in\n// retro-audit-2026-04-19 (M-5).\nimport {\n\tvisitFlatClause,\n\tvisitGroupClause,\n\tvisitLimitClause,\n\tvisitLockClause,\n\tvisitOffsetClause,\n\tvisitOrderClause,\n\tvisitOrderItem,\n\tvisitOrderList,\n\tvisitProgram,\n\tvisitQuery,\n\tvisitQueryClause,\n\tvisitRelationStarExpr,\n\tvisitSelectClause,\n\tvisitSelectItem,\n\tvisitSelectList,\n\tvisitSetClause,\n\tvisitStatement,\n\tvisitTableRef,\n\tvisitWhereClause,\n} from './visit-query.js';\n\nconst BaseCstVisitor = nqlParser.getBaseCstVisitorConstructor();\n\n/**\n * CST Visitor that transforms Chevrotain CST to NQL AST.\n * All logic lives in domain modules; this class is a thin dispatcher.\n */\nexport class NqlCstVisitor extends BaseCstVisitor {\n\tprivate readonly v: VisitFn;\n\treadonly warnings: NqlWarning[] = [];\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.v = (node: CstNode) => this.visit(node);\n\t\tthis.validateVisitor();\n\t}\n\n\t/** Clear warnings before each parse run (singleton reuse). */\n\tresetWarnings(): void {\n\t\tthis.warnings.length = 0;\n\t}\n\n\t// -- Query structure --\n\tprogram(ctx: CstContext) {\n\t\treturn visitProgram(ctx, this.v);\n\t}\n\tstatement(ctx: CstContext) {\n\t\treturn visitStatement(ctx, this.v);\n\t}\n\tquery(ctx: CstContext) {\n\t\treturn visitQuery(ctx, this.v);\n\t}\n\ttableRef(ctx: CstContext) {\n\t\treturn visitTableRef(ctx, this.v);\n\t}\n\tqueryClause(ctx: CstContext) {\n\t\treturn visitQueryClause(ctx, this.v);\n\t}\n\twhereClause(ctx: CstContext) {\n\t\treturn visitWhereClause(ctx, this.v);\n\t}\n\tselectClause(ctx: CstContext) {\n\t\treturn visitSelectClause(ctx, this.v);\n\t}\n\tflatClause(_ctx: CstContext) {\n\t\treturn visitFlatClause();\n\t}\n\tgroupClause(ctx: CstContext) {\n\t\treturn visitGroupClause(ctx, this.v);\n\t}\n\torderClause(ctx: CstContext) {\n\t\treturn visitOrderClause(ctx, this.v);\n\t}\n\tlimitClause(ctx: CstContext) {\n\t\treturn visitLimitClause(ctx, this.v);\n\t}\n\toffsetClause(ctx: CstContext) {\n\t\treturn visitOffsetClause(ctx);\n\t}\n\tselectList(ctx: CstContext) {\n\t\treturn visitSelectList(ctx, this.v);\n\t}\n\tselectItem(ctx: CstContext) {\n\t\treturn visitSelectItem(ctx, this.v);\n\t}\n\trelationStarExpr(ctx: CstContext) {\n\t\treturn visitRelationStarExpr(ctx, this.v);\n\t}\n\torderList(ctx: CstContext) {\n\t\treturn visitOrderList(ctx, this.v);\n\t}\n\torderItem(ctx: CstContext) {\n\t\treturn visitOrderItem(ctx, this.v);\n\t}\n\tlockClause(ctx: CstContext) {\n\t\treturn visitLockClause(ctx);\n\t}\n\n\t// -- Boolean + comparison --\n\tbooleanExpr(ctx: CstContext) {\n\t\treturn visitBooleanExpr(ctx, this.v);\n\t}\n\torExpr(ctx: CstContext) {\n\t\treturn visitOrExpr(ctx, this.v);\n\t}\n\tandExpr(ctx: CstContext) {\n\t\treturn visitAndExpr(ctx, this.v);\n\t}\n\tnotExpr(ctx: CstContext) {\n\t\treturn visitNotExpr(ctx, this.v);\n\t}\n\tprimaryCond(ctx: CstContext) {\n\t\treturn visitPrimaryCond(ctx, this.v);\n\t}\n\tcomparisonSuffix(_ctx: CstContext) {\n\t\treturn visitComparisonSuffix();\n\t}\n\tbetweenSuffix(_ctx: CstContext) {\n\t\treturn visitBetweenSuffix();\n\t}\n\trangeOpSuffix(_ctx: CstContext) {\n\t\treturn visitRangeOpSuffix();\n\t}\n\tjsonComparisonSuffix(_ctx: CstContext) {\n\t\treturn visitJsonComparisonSuffix();\n\t}\n\tinSuffix(_ctx: CstContext) {\n\t\treturn visitInSuffix();\n\t}\n\n\t// BATCH-001: stub — anySuffix is handled by visitPrimaryCond directly\n\tanySuffix(_ctx: CstContext) {\n\t\treturn undefined;\n\t}\n\tisNullSuffix(_ctx: CstContext) {\n\t\treturn visitIsNullSuffix();\n\t}\n\tcompOp(ctx: CstContext) {\n\t\treturn visitCompOp(ctx);\n\t}\n\trangeOp(ctx: CstContext) {\n\t\treturn visitRangeOp(ctx);\n\t}\n\n\t// -- Arithmetic + primary --\n\texpression(ctx: CstContext) {\n\t\treturn visitExpression(ctx, this.v);\n\t}\n\taddExpr(ctx: CstContext) {\n\t\treturn visitAddExpr(ctx, this.v);\n\t}\n\tmulExpr(ctx: CstContext) {\n\t\treturn visitMulExpr(ctx, this.v);\n\t}\n\tunaryExpr(ctx: CstContext) {\n\t\treturn visitUnaryExpr(ctx, this.v);\n\t}\n\tjsonAccessExpr(ctx: CstContext) {\n\t\treturn visitJsonAccessExpr(ctx, this.v, this.warnings);\n\t}\n\tprimaryExpr(ctx: CstContext) {\n\t\treturn visitPrimaryExpr(ctx, this.v);\n\t}\n\n\t// -- CASE --\n\tcaseExpr(ctx: CstContext) {\n\t\treturn visitCaseExpr(ctx, this.v);\n\t}\n\tsearchedCaseBody(_ctx: CstContext) {\n\t\treturn visitSearchedCaseBody();\n\t}\n\tsimpleCaseBody(_ctx: CstContext) {\n\t\treturn visitSimpleCaseBody();\n\t}\n\n\t// -- Subquery + path + list --\n\tscalarSubquery(ctx: CstContext) {\n\t\treturn visitScalarSubquery(ctx, this.v);\n\t}\n\tpathExpr(ctx: CstContext) {\n\t\treturn visitPathExpr(ctx, this.v);\n\t}\n\texprList(ctx: CstContext) {\n\t\treturn visitExprList(ctx, this.v);\n\t}\n\n\t// -- Relation filters --\n\texistsCheck(ctx: CstContext) {\n\t\treturn visitExistsCheck(ctx, this.v);\n\t}\n\tquantifiedRelationFilter(ctx: CstContext) {\n\t\treturn visitQuantifiedRelationFilter(ctx, this.v);\n\t}\n\tallRelationFilter(ctx: CstContext) {\n\t\treturn visitAllRelationFilter(ctx, this.v);\n\t}\n\n\t// -- Functions + window --\n\tfuncCall(ctx: CstContext) {\n\t\treturn visitFuncCall(ctx, this.v);\n\t}\n\twindowClause(ctx: CstContext) {\n\t\treturn visitWindowClause(ctx, this.v);\n\t}\n\tpartitionClause(ctx: CstContext) {\n\t\treturn visitPartitionClause(ctx, this.v);\n\t}\n\torderClauseInWindow(ctx: CstContext) {\n\t\treturn visitOrderClauseInWindow(ctx, this.v);\n\t}\n\tfuncArgList(ctx: CstContext) {\n\t\treturn visitFuncArgList(ctx, this.v);\n\t}\n\n\t// -- Literals + identifiers --\n\tliteral(ctx: CstContext) {\n\t\treturn visitLiteral(ctx, this.v);\n\t}\n\trangeLiteral(ctx: CstContext) {\n\t\treturn visitRangeLiteral(ctx, this.v);\n\t}\n\trangeValue(ctx: CstContext) {\n\t\treturn visitRangeValue(ctx);\n\t}\n\tidentSegment(ctx: CstContext) {\n\t\treturn visitIdentSegment(ctx);\n\t}\n\tidentList(ctx: CstContext) {\n\t\treturn visitIdentList(ctx, this.v);\n\t}\n\tvalueList(ctx: CstContext) {\n\t\treturn visitValueList(ctx, this.v);\n\t}\n\n\t// -- Mutations --\n\tmutationPipeline(ctx: CstContext) {\n\t\treturn visitMutationPipeline(ctx, this.v);\n\t}\n\tmutationClause(ctx: CstContext) {\n\t\treturn visitMutationClause(ctx, this.v);\n\t}\n\tbindClause(ctx: CstContext) {\n\t\treturn visitBindClause(ctx, this.v);\n\t}\n\tsetClause(ctx: CstContext) {\n\t\treturn visitSetClause(ctx, this.v);\n\t}\n\tmutation(ctx: CstContext) {\n\t\treturn visitMutation(ctx, this.v);\n\t}\n\tinsertStmt(ctx: CstContext) {\n\t\treturn visitInsertStmt(ctx, this.v);\n\t}\n\tinsertFromStmt(ctx: CstContext) {\n\t\treturn visitInsertFromStmt(ctx, this.v);\n\t}\n\tupdateStmt(ctx: CstContext) {\n\t\treturn visitUpdateStmt(ctx, this.v);\n\t}\n\tdeleteStmt(ctx: CstContext) {\n\t\treturn visitDeleteStmt(ctx, this.v);\n\t}\n\tupsertStmt(ctx: CstContext) {\n\t\treturn visitUpsertStmt(ctx, this.v);\n\t}\n\tupsertFromStmt(ctx: CstContext) {\n\t\treturn visitUpsertFromStmt(ctx, this.v);\n\t}\n\tassignmentList(ctx: CstContext) {\n\t\treturn visitAssignmentList(ctx, this.v);\n\t}\n\tvaluesTuple(ctx: CstContext) {\n\t\treturn visitValuesTuple(ctx, this.v);\n\t}\n\tassignment(ctx: CstContext) {\n\t\treturn visitAssignment(ctx, this.v);\n\t}\n\n\t// -- CTE / WITH --\n\twithQuery(ctx: CstContext) {\n\t\treturn visitWithQuery(ctx, this.v);\n\t}\n\tcteList(ctx: CstContext) {\n\t\treturn visitCteList(ctx, this.v);\n\t}\n\tcteItem(ctx: CstContext) {\n\t\treturn visitCteItem(ctx, this.v);\n\t}\n}\n\n// Singleton visitor instance\nexport const nqlVisitor = new NqlCstVisitor();\n\n/**\n * Transform CST to AST, collecting any warnings emitted during traversal.\n */\nexport function cstToAst(cst: CstNode): {\n\tast: NqlProgram;\n\twarnings: NqlWarning[];\n} {\n\tnqlVisitor.resetWarnings();\n\tconst ast: NqlProgram = nqlVisitor.visit(cst);\n\treturn { ast, warnings: [...nqlVisitor.warnings] };\n}\n","/**\n * @dbsp/nql - NQL v2.0 Parser\n *\n * A human and LLM-friendly query language for databases.\n *\n * @example\n * ```typescript\n * import { parse, compile } from '@dbsp/nql';\n *\n * // Parse only (no schema validation)\n * const result = parse('products | where active = true');\n *\n * // Parse + compile to IntentAST\n * const intent = compile('products | where active = true', schema);\n * ```\n */\n\n// Re-export compiler types\nexport type {\n\tColumnValidatorSchema,\n\tCompileResult,\n\tDeleteIntent,\n\tExpressionIntent,\n\tIncludeIntent,\n\tInsertIntent,\n\tMutationIntent,\n\tOrderByIntent,\n\tQueryIntent,\n\tSelectAllIntent,\n\tSelectFieldsIntent,\n\tSelectIntent,\n\tSelectWithExpressionsIntent,\n\tUpdateIntent,\n\tUpsertIntent,\n\tWhereAndIntent,\n\tWhereComparisonIntent,\n\tWhereInIntent,\n\tWhereIntent,\n\tWhereLikeIntent,\n\tWhereNotIntent,\n\tWhereNullIntent,\n\tWhereOrIntent,\n\tWhereRangeIntent,\n} from './compiler/index.js';\nexport {\n\tcreateCompiler,\n\tNqlCompiler,\n\ttype NqlCompilerOptions,\n} from './compiler/index.js';\n// Re-export error types\nexport type {\n\tNqlError,\n\tNqlParseError,\n\tNqlSemanticError,\n\tNqlWarning,\n} from './errors/types.js';\n// Re-export lexer\nexport { allTokens, NqlLexer } from './lexer/index.js';\n// Re-export AST types\nexport * from './parser/ast.js';\n// Re-export parser\nexport { NqlParser, parseCst } from './parser/index.js';\n// Re-export visitor\nexport { cstToAst, NqlCstVisitor, nqlVisitor } from './semantic/index.js';\n\n// Main API types\nexport interface ParseOptions {\n\t/** Reject keyword aliases (default: true) */\n\tstrictMode?: boolean;\n\t/** Maximum subquery nesting depth (default: 10) */\n\tmaxSubqueryDepth?: number;\n\t/** Maximum clauses per query (default: 20) */\n\tmaxClauses?: number;\n\t/** Maximum joins per query (default: 10) */\n\tmaxJoins?: number;\n}\n\nexport interface ParseResult<T> {\n\tsuccess: boolean;\n\tast?: T;\n\terrors: import('./errors/types.js').NqlError[];\n\twarnings: import('./errors/types.js').NqlWarning[];\n}\n\nimport {\n\ttype ColumnValidatorSchema,\n\ttype CompileResult,\n\tNqlCompiler,\n} from './compiler/index.js';\nimport { NqlErrorCodes, NqlSemanticException } from './errors/index.js';\nimport type { NqlProgram } from './parser/ast.js';\nimport { parseCst } from './parser/index.js';\nimport { cstToAst } from './semantic/index.js';\n\n/**\n * Parse NQL input without schema validation\n */\nexport function parse(\n\tinput: string,\n\t_options?: ParseOptions,\n): ParseResult<NqlProgram> {\n\tconst cstResult = parseCst(input);\n\n\tif (cstResult.errors.length > 0) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terrors: cstResult.errors.map((err) => ({\n\t\t\t\tcode: NqlErrorCodes.PARSE_UNEXPECTED_TOKEN,\n\t\t\t\tmessage: err.message,\n\t\t\t\tlocation: err.token\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tline: err.token.startLine ?? 1,\n\t\t\t\t\t\t\tcolumn: err.token.startColumn ?? 1,\n\t\t\t\t\t\t\toffset: err.token.startOffset ?? 0,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t})),\n\t\t\twarnings: [],\n\t\t};\n\t}\n\n\ttry {\n\t\tif (!cstResult.cst) {\n\t\t\tthrow new Error('CST is undefined despite no parse errors');\n\t\t}\n\t\tconst { ast, warnings } = cstToAst(cstResult.cst);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tast,\n\t\t\terrors: [],\n\t\t\twarnings,\n\t\t};\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terrors: [\n\t\t\t\t{\n\t\t\t\t\tcode: NqlErrorCodes.PARSE_UNEXPECTED_TOKEN,\n\t\t\t\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\t\t\t},\n\t\t\t],\n\t\t\twarnings: [],\n\t\t};\n\t}\n}\n\n/**\n * Parse, validate, and compile NQL to IntentAST\n */\nexport function compile(\n\tinput: string,\n\tschema: unknown, // ModelIR from @dbsp/core — satisfies ColumnValidatorSchema\n\toptions?: ParseOptions,\n\tcompilerOptions?: import('./compiler/index.js').NqlCompilerOptions,\n): ParseResult<CompileResult> {\n\tconst parseResult = parse(input, options);\n\n\tif (!parseResult.success || !parseResult.ast) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terrors: parseResult.errors,\n\t\t\twarnings: parseResult.warnings,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst validatorSchema =\n\t\t\tschema && hasColumnValidatorShape(schema)\n\t\t\t\t? (schema as ColumnValidatorSchema)\n\t\t\t\t: undefined;\n\t\tconst compiler = new NqlCompiler(compilerOptions, validatorSchema);\n\t\tconst result = compiler.compile(parseResult.ast);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tast: result,\n\t\t\terrors: [],\n\t\t\twarnings: parseResult.warnings,\n\t\t};\n\t} catch (err) {\n\t\tconst code =\n\t\t\terr instanceof NqlSemanticException\n\t\t\t\t? err.code\n\t\t\t\t: NqlErrorCodes.SEM_UNREACHABLE;\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terrors: [\n\t\t\t\t{\n\t\t\t\t\tcode,\n\t\t\t\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\t\t\t},\n\t\t\t],\n\t\t\twarnings: [],\n\t\t};\n\t}\n}\n\n/** Runtime check: does the schema satisfy the ColumnValidatorSchema duck-type? */\nfunction hasColumnValidatorShape(obj: unknown): obj is ColumnValidatorSchema {\n\treturn (\n\t\ttypeof obj === 'object' &&\n\t\tobj !== null &&\n\t\ttypeof (obj as Record<string, unknown>).getTable === 'function' &&\n\t\ttypeof (obj as Record<string, unknown>).getRelationsFrom === 'function'\n\t);\n}\n"]}
|