@prisma-next/sql-relational-core 0.6.0-dev.6 → 0.6.0-dev.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +1 -1
  2. package/dist/{codec-types-BUfBna4G.d.mts → codec-types-Cezo7k-i.d.mts} +9 -9
  3. package/dist/codec-types-Cezo7k-i.d.mts.map +1 -0
  4. package/dist/{errors-BgNpVAT8.d.mts → errors-D2KewtVl.d.mts} +2 -2
  5. package/dist/{errors-BgNpVAT8.d.mts.map → errors-D2KewtVl.d.mts.map} +1 -1
  6. package/dist/exports/ast.d.mts +3 -12
  7. package/dist/exports/ast.d.mts.map +1 -1
  8. package/dist/exports/ast.mjs +2 -32
  9. package/dist/exports/ast.mjs.map +1 -1
  10. package/dist/exports/codec-descriptor-registry.d.mts +20 -4
  11. package/dist/exports/codec-descriptor-registry.d.mts.map +1 -1
  12. package/dist/exports/codec-descriptor-registry.mjs +38 -2
  13. package/dist/exports/codec-descriptor-registry.mjs.map +1 -1
  14. package/dist/exports/errors.d.mts +1 -1
  15. package/dist/exports/expression.d.mts +17 -16
  16. package/dist/exports/expression.d.mts.map +1 -1
  17. package/dist/exports/expression.mjs +19 -25
  18. package/dist/exports/expression.mjs.map +1 -1
  19. package/dist/exports/middleware.d.mts +1 -1
  20. package/dist/exports/middleware.mjs +1 -1
  21. package/dist/exports/plan.d.mts +2 -2
  22. package/dist/exports/query-lane-context.d.mts +1 -1
  23. package/dist/exports/types.d.mts +2 -2
  24. package/dist/index.d.mts +12 -12
  25. package/dist/index.mjs +5 -5
  26. package/dist/{middleware-USDeR8p1.d.mts → middleware-CfWhG9hx.d.mts} +3 -9
  27. package/dist/middleware-CfWhG9hx.d.mts.map +1 -0
  28. package/dist/{middleware-D2Wv9QIf.mjs → middleware-DGoIUH9C.mjs} +5 -17
  29. package/dist/middleware-DGoIUH9C.mjs.map +1 -0
  30. package/dist/{plan-DFpOIsKB.d.mts → plan-DmBWXsDN.d.mts} +2 -2
  31. package/dist/{plan-DFpOIsKB.d.mts.map → plan-DmBWXsDN.d.mts.map} +1 -1
  32. package/dist/{query-lane-context-C2tLZGp4.d.mts → query-lane-context-DHsPbikl.d.mts} +16 -5
  33. package/dist/query-lane-context-DHsPbikl.d.mts.map +1 -0
  34. package/dist/{sql-execution-plan-ffz8TSfr.d.mts → sql-execution-plan-DM2Hcvvn.d.mts} +2 -2
  35. package/dist/{sql-execution-plan-ffz8TSfr.d.mts.map → sql-execution-plan-DM2Hcvvn.d.mts.map} +1 -1
  36. package/dist/{types-D6Pk1DTr.d.mts → types-BQK1PdQu.d.mts} +4 -4
  37. package/dist/{types-D6Pk1DTr.d.mts.map → types-BQK1PdQu.d.mts.map} +1 -1
  38. package/dist/{types-CL18G37a.d.mts → types-BWJCGyVL.d.mts} +3 -3
  39. package/dist/{types-CL18G37a.d.mts.map → types-BWJCGyVL.d.mts.map} +1 -1
  40. package/dist/{types-CK9ZJ6OU.mjs → types-DRYJSMk1.mjs} +27 -18
  41. package/dist/types-DRYJSMk1.mjs.map +1 -0
  42. package/dist/{types-BZcKgaYA.d.mts → types-juiKe2qf.d.mts} +18 -25
  43. package/dist/types-juiKe2qf.d.mts.map +1 -0
  44. package/package.json +10 -10
  45. package/src/ast/codec-types.ts +8 -6
  46. package/src/ast/types.ts +32 -38
  47. package/src/codec-descriptor-registry.ts +8 -1
  48. package/src/codec-ref-for-column.ts +34 -0
  49. package/src/exports/ast.ts +0 -1
  50. package/src/exports/codec-descriptor-registry.ts +1 -0
  51. package/src/expression.ts +35 -24
  52. package/src/middleware/param-ref-mutator.ts +3 -19
  53. package/src/query-lane-context.ts +14 -3
  54. package/dist/codec-types-BUfBna4G.d.mts.map +0 -1
  55. package/dist/middleware-D2Wv9QIf.mjs.map +0 -1
  56. package/dist/middleware-USDeR8p1.d.mts.map +0 -1
  57. package/dist/query-lane-context-C2tLZGp4.d.mts.map +0 -1
  58. package/dist/types-BZcKgaYA.d.mts.map +0 -1
  59. package/dist/types-CK9ZJ6OU.mjs.map +0 -1
  60. package/src/ast/validate-param-refs.ts +0 -39
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-DRYJSMk1.mjs","names":[],"sources":["../src/ast/types.ts"],"sourcesContent":["import type { ParamSpec } from '@prisma-next/operations';\nimport type { SqlLoweringSpec } from '@prisma-next/sql-operations';\nimport type { CodecRef } from './codec-types';\n\nexport type Direction = 'asc' | 'desc';\n\nexport type BinaryOp = 'eq' | 'neq' | 'gt' | 'lt' | 'gte' | 'lte' | 'like' | 'in' | 'notIn';\n\nexport type AggregateCountFn = 'count';\nexport type AggregateOpFn = 'sum' | 'avg' | 'min' | 'max';\nexport type AggregateFn = AggregateCountFn | AggregateOpFn;\n\nexport interface ExpressionSource {\n toExpr(): AnyExpression;\n}\n\nexport interface ExpressionRewriter {\n columnRef?(expr: ColumnRef): AnyExpression;\n identifierRef?(expr: IdentifierRef): AnyExpression;\n paramRef?(expr: ParamRef): ParamRef | LiteralExpr;\n literal?(expr: LiteralExpr): LiteralExpr;\n list?(expr: ListExpression): ListExpression | LiteralExpr;\n select?(ast: SelectAst): SelectAst;\n}\n\nexport interface AstRewriter extends ExpressionRewriter {\n tableSource?(source: TableSource): TableSource;\n eqColJoinOn?(on: EqColJoinOn): EqColJoinOn | AnyExpression;\n}\n\nexport interface ExprVisitor<R> {\n columnRef(expr: ColumnRef): R;\n identifierRef(expr: IdentifierRef): R;\n subquery(expr: SubqueryExpr): R;\n operation(expr: OperationExpr): R;\n aggregate(expr: AggregateExpr): R;\n jsonObject(expr: JsonObjectExpr): R;\n jsonArrayAgg(expr: JsonArrayAggExpr): R;\n binary(expr: BinaryExpr): R;\n and(expr: AndExpr): R;\n or(expr: OrExpr): R;\n exists(expr: ExistsExpr): R;\n nullCheck(expr: NullCheckExpr): R;\n not(expr: NotExpr): R;\n literal(expr: LiteralExpr): R;\n param(expr: ParamRef): R;\n list(expr: ListExpression): R;\n}\n\nexport interface ExpressionFolder<T> {\n empty: T;\n combine(a: T, b: T): T;\n isAbsorbing?(value: T): boolean;\n columnRef?(expr: ColumnRef): T;\n identifierRef?(expr: IdentifierRef): T;\n paramRef?(expr: ParamRef): T;\n literal?(expr: LiteralExpr): T;\n list?(expr: ListExpression): T;\n select?(ast: SelectAst): T;\n}\n\nexport type ProjectionExpr = AnyExpression;\nexport type InsertValue = ColumnRef | ParamRef | DefaultValueExpr;\nexport type JoinOnExpr = EqColJoinOn | AnyExpression;\nexport type WhereArg = AnyExpression | ToWhereExpr;\nexport type JsonObjectEntry = {\n readonly key: string;\n readonly value: ProjectionExpr;\n};\n\nfunction frozenArrayCopy<T>(values: readonly T[]): ReadonlyArray<T> {\n return Object.freeze([...values]);\n}\n\nfunction frozenOptionalRecordCopy<T extends Record<string, unknown>>(\n value: T | undefined,\n): Readonly<T> | undefined {\n return value === undefined ? undefined : Object.freeze({ ...value });\n}\n\nfunction frozenRecordCopy<T>(record: Readonly<Record<string, T>>): Readonly<Record<string, T>> {\n return Object.freeze({ ...record });\n}\n\nfunction frozenCodecRef(codec: CodecRef): CodecRef {\n const typeParams =\n codec.typeParams === undefined\n ? undefined\n : (structuredClone(codec.typeParams) as CodecRef['typeParams']);\n return Object.freeze(\n typeParams === undefined ? { codecId: codec.codecId } : { codecId: codec.codecId, typeParams },\n );\n}\n\nfunction freezeRows(\n rows: ReadonlyArray<Record<string, InsertValue>>,\n): ReadonlyArray<Readonly<Record<string, InsertValue>>> {\n return Object.freeze(rows.map((row) => Object.freeze({ ...row })));\n}\n\nfunction combineAll<T>(folder: ExpressionFolder<T>, thunks: Array<() => T>): T {\n let result = folder.empty;\n for (const thunk of thunks) {\n if (folder.isAbsorbing?.(result)) {\n return result;\n }\n result = folder.combine(result, thunk());\n }\n return result;\n}\n\nfunction rewriteComparable(value: AnyExpression, rewriter: ExpressionRewriter): AnyExpression {\n switch (value.kind) {\n case 'param-ref':\n return rewriter.paramRef ? rewriter.paramRef(value) : value;\n case 'literal':\n return rewriter.literal ? rewriter.literal(value) : value;\n case 'list':\n if (rewriter.list) {\n return rewriter.list(value);\n }\n return value.rewrite(rewriter);\n default:\n return value.rewrite(rewriter);\n }\n}\n\nfunction foldComparable<T>(value: AnyExpression, folder: ExpressionFolder<T>): T {\n switch (value.kind) {\n case 'param-ref':\n return folder.paramRef ? folder.paramRef(value) : folder.empty;\n case 'literal':\n return folder.literal ? folder.literal(value) : folder.empty;\n case 'list':\n return value.fold(folder);\n default:\n return value.fold(folder);\n }\n}\n\nfunction collectColumnRefsWith<TNode extends Expression>(node: TNode): ColumnRef[] {\n return node.fold<ColumnRef[]>({\n empty: [],\n combine: (a, b) => [...a, ...b],\n columnRef: (columnRef) => [columnRef],\n select: (ast) => ast.collectColumnRefs(),\n });\n}\n\nfunction collectParamRefsWith<TNode extends Expression>(node: TNode): ParamRef[] {\n return node.fold<ParamRef[]>({\n empty: [],\n combine: (a, b) => [...a, ...b],\n paramRef: (paramRef) => [paramRef],\n select: (ast) => ast.collectParamRefs(),\n });\n}\n\nfunction rewriteTableSource(table: TableSource, rewriter: AstRewriter): TableSource {\n return rewriter.tableSource ? rewriter.tableSource(table) : table;\n}\n\nfunction rewriteProjectionItem(item: ProjectionItem, rewriter: AstRewriter): ProjectionItem {\n const rewrittenExpr =\n item.expr.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(item.expr)\n : item.expr\n : item.expr.rewrite(rewriter);\n return new ProjectionItem(item.alias, rewrittenExpr, item.codec);\n}\n\nfunction rewriteInsertValue(value: InsertValue, rewriter: AstRewriter): InsertValue {\n switch (value.kind) {\n case 'param-ref':\n return rewriter.paramRef ? rewriteParamRefForInsert(value, rewriter) : value;\n case 'column-ref':\n return rewriter.columnRef ? rewriteColumnRefForInsert(value, rewriter) : value;\n case 'default-value':\n return value;\n }\n}\n\nfunction rewriteParamRefForInsert(value: ParamRef, rewriter: AstRewriter): InsertValue {\n const rewritten = rewriter.paramRef ? rewriter.paramRef(value) : value;\n return rewritten.kind === 'param-ref' ? rewritten : value;\n}\n\nfunction rewriteColumnRefForInsert(value: ColumnRef, rewriter: AstRewriter): InsertValue {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(value) : value;\n return rewritten.kind === 'column-ref' ? rewritten : value;\n}\n\nfunction rewriteInsertRow(\n row: Readonly<Record<string, InsertValue>>,\n rewriter: AstRewriter,\n): Record<string, InsertValue> {\n const result: Record<string, InsertValue> = {};\n for (const [key, value] of Object.entries(row)) {\n result[key] = rewriteInsertValue(value, rewriter);\n }\n return result;\n}\n\nfunction rewriteUpdateSetValue(\n value: ColumnRef | ParamRef,\n rewriter: AstRewriter,\n): ColumnRef | ParamRef {\n if (value.kind === 'column-ref') {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(value) : value;\n return rewritten.kind === 'column-ref' ? rewritten : value;\n }\n const rewritten = rewriter.paramRef ? rewriter.paramRef(value) : value;\n return rewritten.kind === 'param-ref' ? rewritten : value;\n}\n\nfunction rewriteUpdateSet(\n set: Readonly<Record<string, ColumnRef | ParamRef>>,\n rewriter: AstRewriter,\n): Record<string, ColumnRef | ParamRef> {\n const result: Record<string, ColumnRef | ParamRef> = {};\n for (const [key, value] of Object.entries(set)) {\n result[key] = rewriteUpdateSetValue(value, rewriter);\n }\n return result;\n}\n\nfunction rewriteOnConflict(onConflict: InsertOnConflict, rewriter: AstRewriter): InsertOnConflict {\n const columns = onConflict.columns.map((columnRef) => {\n const rewritten = rewriter.columnRef ? rewriter.columnRef(columnRef) : columnRef;\n return rewritten.kind === 'column-ref' ? rewritten : columnRef;\n });\n\n if (onConflict.action.kind === 'do-nothing') {\n return new InsertOnConflict(columns, new DoNothingConflictAction());\n }\n\n return new InsertOnConflict(\n columns,\n new DoUpdateSetConflictAction(rewriteUpdateSet(onConflict.action.set, rewriter)),\n );\n}\n\nabstract class AstNode {\n abstract readonly kind: string;\n\n protected freeze(): void {\n Object.freeze(this);\n }\n}\n\nabstract class QueryAst extends AstNode {\n abstract collectParamRefs(): ParamRef[];\n abstract toQueryAst(): AnyQueryAst;\n}\n\nabstract class FromSource extends AstNode {\n abstract rewrite(rewriter: AstRewriter): AnyFromSource;\n abstract toFromSource(): AnyFromSource;\n}\n\nabstract class Expression extends AstNode implements ExpressionSource {\n abstract accept<R>(visitor: ExprVisitor<R>): R;\n abstract rewrite(rewriter: ExpressionRewriter): AnyExpression;\n abstract fold<T>(folder: ExpressionFolder<T>): T;\n\n collectColumnRefs(): ColumnRef[] {\n return collectColumnRefsWith(this);\n }\n\n collectParamRefs(): ParamRef[] {\n return collectParamRefsWith(this);\n }\n\n baseColumnRef(): ColumnRef {\n throw new Error(`${this.constructor.name} does not expose a base column reference`);\n }\n\n toExpr(): AnyExpression {\n return this as unknown as AnyExpression;\n }\n\n not(): NotExpr {\n return new NotExpr(this as unknown as AnyExpression);\n }\n}\n\nexport class TableSource extends FromSource {\n readonly kind = 'table-source' as const;\n readonly name: string;\n readonly alias: string | undefined;\n\n constructor(name: string, alias?: string) {\n super();\n this.name = name;\n this.alias = alias;\n this.freeze();\n }\n\n static named(name: string, alias?: string): TableSource {\n return new TableSource(name, alias);\n }\n\n override rewrite(rewriter: AstRewriter): AnyFromSource {\n return rewriter.tableSource ? rewriter.tableSource(this) : this;\n }\n\n override toFromSource(): AnyFromSource {\n return this;\n }\n}\n\nexport interface TableRef {\n readonly name: string;\n readonly alias?: string;\n}\n\nexport class DerivedTableSource extends FromSource {\n readonly kind = 'derived-table-source' as const;\n readonly alias: string;\n readonly query: SelectAst;\n\n constructor(alias: string, query: SelectAst) {\n super();\n this.alias = alias;\n this.query = query;\n this.freeze();\n }\n\n static as(alias: string, query: SelectAst): DerivedTableSource {\n return new DerivedTableSource(alias, query);\n }\n\n // Intentionally does not call rewriter.tableSource — derived tables are rewritten via their inner query, not intercepted at the FromSource level. A future fromSource?(source: AnyFromSource) callback would be needed for that.\n override rewrite(rewriter: AstRewriter): AnyFromSource {\n return new DerivedTableSource(this.alias, this.query.rewrite(rewriter));\n }\n\n override toFromSource(): AnyFromSource {\n return this;\n }\n}\n\nexport class ColumnRef extends Expression {\n readonly kind = 'column-ref' as const;\n readonly table: string;\n readonly column: string;\n\n constructor(table: string, column: string) {\n super();\n this.table = table;\n this.column = column;\n this.freeze();\n }\n\n static of(table: string, column: string): ColumnRef {\n return new ColumnRef(table, column);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.columnRef(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.columnRef ? rewriter.columnRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.columnRef ? folder.columnRef(this) : folder.empty;\n }\n\n override baseColumnRef(): ColumnRef {\n return this;\n }\n}\n\nexport class IdentifierRef extends Expression {\n readonly kind = 'identifier-ref' as const;\n readonly name: string;\n\n constructor(name: string) {\n super();\n this.name = name;\n this.freeze();\n }\n\n static of(name: string): IdentifierRef {\n return new IdentifierRef(name);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.identifierRef(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.identifierRef ? rewriter.identifierRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.identifierRef ? folder.identifierRef(this) : folder.empty;\n }\n}\n\nexport class ParamRef extends Expression {\n readonly kind = 'param-ref' as const;\n readonly value: unknown;\n readonly name: string | undefined;\n /**\n * Codec identity carried by every column-bound `ParamRef`. The encode-side dispatch path materialises the per-instance codec through `contractCodecs.forCodecRef(codec)` — content-keyed memoisation on `(codecId, canonicalize(typeParams))` keeps repeated lookups for the same logical column on one shared {@link Codec}.\n *\n * `codec` may be `undefined` for `ParamRef`s constructed without a column-bound site (literals, transient builder state); the runtime treats those as untyped passthroughs.\n */\n readonly codec: CodecRef | undefined;\n\n constructor(\n value: unknown,\n options?: {\n name?: string;\n codec?: CodecRef;\n },\n ) {\n super();\n this.value = value;\n this.name = options?.name;\n this.codec = options?.codec ? frozenCodecRef(options.codec) : undefined;\n this.freeze();\n }\n\n static of(\n value: unknown,\n options?: {\n name?: string;\n codec?: CodecRef;\n },\n ): ParamRef {\n return new ParamRef(value, options);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.param(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.paramRef ? rewriter.paramRef(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.paramRef ? folder.paramRef(this) : folder.empty;\n }\n}\n\nexport class DefaultValueExpr extends AstNode {\n readonly kind = 'default-value' as const;\n\n constructor() {\n super();\n this.freeze();\n }\n}\n\nexport class LiteralExpr extends Expression {\n readonly kind = 'literal' as const;\n readonly value: unknown;\n\n constructor(value: unknown) {\n super();\n this.value = value;\n this.freeze();\n }\n\n static of(value: unknown): LiteralExpr {\n return new LiteralExpr(value);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.literal(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return rewriter.literal ? rewriter.literal(this) : this;\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.literal ? folder.literal(this) : folder.empty;\n }\n}\n\nexport class SubqueryExpr extends Expression {\n readonly kind = 'subquery' as const;\n readonly query: SelectAst;\n\n constructor(query: SelectAst) {\n super();\n this.query = query;\n this.freeze();\n }\n\n static of(query: SelectAst): SubqueryExpr {\n return new SubqueryExpr(query);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.subquery(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n const query = this.query.rewrite(rewriter);\n return new SubqueryExpr(query);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.select ? folder.select(this.query) : folder.empty;\n }\n}\n\nexport class OperationExpr extends Expression {\n readonly kind = 'operation' as const;\n readonly method: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr>;\n readonly returns: ParamSpec;\n readonly lowering: SqlLoweringSpec;\n\n constructor(options: {\n readonly method: string;\n readonly self: AnyExpression;\n readonly args: ReadonlyArray<AnyExpression | ParamRef | LiteralExpr> | undefined;\n readonly returns: ParamSpec;\n readonly lowering: SqlLoweringSpec;\n }) {\n super();\n this.method = options.method;\n this.self = options.self;\n this.args = frozenArrayCopy(options.args ?? []);\n this.returns = options.returns;\n this.lowering = options.lowering;\n this.freeze();\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.operation(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new OperationExpr({\n method: this.method,\n self: this.self.rewrite(rewriter),\n args: this.args.map((arg) => rewriteComparable(arg, rewriter)) as ReadonlyArray<\n AnyExpression | ParamRef | LiteralExpr\n >,\n returns: this.returns,\n lowering: this.lowering,\n });\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => this.self.fold(folder),\n ...this.args.map((arg) => () => foldComparable(arg, folder)),\n ]);\n }\n\n override baseColumnRef(): ColumnRef {\n return this.self.baseColumnRef();\n }\n}\n\nexport class AggregateExpr extends Expression {\n readonly kind = 'aggregate' as const;\n readonly fn: AggregateFn;\n readonly expr: AnyExpression | undefined;\n\n constructor(fn: AggregateFn, expr?: AnyExpression) {\n super();\n if (fn !== 'count' && expr === undefined) {\n throw new Error(`Aggregate function \"${fn}\" requires an expression`);\n }\n this.fn = fn;\n this.expr = expr;\n this.freeze();\n }\n\n static count(expr?: AnyExpression): AggregateExpr {\n return new AggregateExpr('count', expr);\n }\n\n static sum(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('sum', expr);\n }\n\n static avg(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('avg', expr);\n }\n\n static min(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('min', expr);\n }\n\n static max(expr: AnyExpression): AggregateExpr {\n return new AggregateExpr('max', expr);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.aggregate(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return this.expr === undefined ? this : new AggregateExpr(this.fn, this.expr.rewrite(rewriter));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr ? this.expr.fold(folder) : folder.empty;\n }\n}\n\nexport class JsonObjectExpr extends Expression {\n readonly kind = 'json-object' as const;\n readonly entries: ReadonlyArray<JsonObjectEntry>;\n\n constructor(entries: ReadonlyArray<JsonObjectEntry>) {\n super();\n this.entries = frozenArrayCopy(entries.map((entry) => Object.freeze({ ...entry })));\n this.freeze();\n }\n\n static entry(key: string, value: ProjectionExpr): JsonObjectEntry {\n return {\n key,\n value,\n };\n }\n\n static fromEntries(entries: ReadonlyArray<JsonObjectEntry>): JsonObjectExpr {\n return new JsonObjectExpr(entries);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.jsonObject(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new JsonObjectExpr(\n this.entries.map((entry) => ({\n key: entry.key,\n value:\n entry.value.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(entry.value)\n : entry.value\n : entry.value.rewrite(rewriter),\n })),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.entries.map(\n (entry) => () =>\n entry.value.kind === 'literal'\n ? folder.literal\n ? folder.literal(entry.value)\n : folder.empty\n : entry.value.fold(folder),\n ),\n );\n }\n}\n\nexport class OrderByItem extends AstNode {\n readonly kind = 'order-by-item' as const;\n readonly expr: AnyExpression;\n readonly dir: Direction;\n\n constructor(expr: AnyExpression, dir: Direction) {\n super();\n this.expr = expr;\n this.dir = dir;\n this.freeze();\n }\n\n static asc(expr: AnyExpression): OrderByItem {\n return new OrderByItem(expr, 'asc');\n }\n\n static desc(expr: AnyExpression): OrderByItem {\n return new OrderByItem(expr, 'desc');\n }\n\n rewrite(rewriter: ExpressionRewriter): OrderByItem {\n return new OrderByItem(this.expr.rewrite(rewriter), this.dir);\n }\n}\n\nexport class JsonArrayAggExpr extends Expression {\n readonly kind = 'json-array-agg' as const;\n readonly expr: AnyExpression;\n readonly onEmpty: 'null' | 'emptyArray';\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n\n constructor(\n expr: AnyExpression,\n onEmpty: 'null' | 'emptyArray' = 'null',\n orderBy?: ReadonlyArray<OrderByItem>,\n ) {\n super();\n this.expr = expr;\n this.onEmpty = onEmpty;\n this.orderBy = orderBy && orderBy.length > 0 ? frozenArrayCopy(orderBy) : undefined;\n this.freeze();\n }\n\n static of(\n expr: AnyExpression,\n onEmpty: 'null' | 'emptyArray' = 'null',\n orderBy?: ReadonlyArray<OrderByItem>,\n ): JsonArrayAggExpr {\n return new JsonArrayAggExpr(expr, onEmpty, orderBy);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.jsonArrayAgg(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new JsonArrayAggExpr(\n this.expr.rewrite(rewriter),\n this.onEmpty,\n this.orderBy?.map((orderItem) => orderItem.rewrite(rewriter)),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => this.expr.fold(folder),\n ...(this.orderBy ?? []).map((orderItem) => () => orderItem.expr.fold(folder)),\n ]);\n }\n}\n\nexport class ListExpression extends Expression {\n readonly kind = 'list' as const;\n readonly values: ReadonlyArray<AnyExpression>;\n\n constructor(values: ReadonlyArray<AnyExpression>) {\n super();\n this.values = frozenArrayCopy(values);\n this.freeze();\n }\n\n static of(values: ReadonlyArray<AnyExpression>): ListExpression {\n return new ListExpression(values);\n }\n\n static fromValues(values: ReadonlyArray<unknown>): ListExpression {\n return new ListExpression(values.map((value) => new LiteralExpr(value)));\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.list(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n if (rewriter.list) {\n return rewriter.list(this);\n }\n\n return new ListExpression(this.values.map((value) => value.rewrite(rewriter)));\n }\n\n fold<T>(folder: ExpressionFolder<T>): T {\n if (folder.list) {\n return folder.list(this);\n }\n return combineAll(\n folder,\n this.values.map((value) => () => value.fold(folder)),\n );\n }\n}\n\nexport class BinaryExpr extends Expression {\n readonly kind = 'binary' as const;\n readonly op: BinaryOp;\n readonly left: AnyExpression;\n readonly right: AnyExpression;\n\n constructor(op: BinaryOp, left: AnyExpression, right: AnyExpression) {\n super();\n this.op = op;\n this.left = left;\n this.right = right;\n this.freeze();\n }\n\n static eq(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('eq', left, right);\n }\n\n static neq(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('neq', left, right);\n }\n\n static gt(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('gt', left, right);\n }\n\n static lt(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('lt', left, right);\n }\n\n static gte(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('gte', left, right);\n }\n\n static lte(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('lte', left, right);\n }\n\n static like(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('like', left, right);\n }\n\n static in(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('in', left, right);\n }\n\n static notIn(left: AnyExpression, right: AnyExpression): BinaryExpr {\n return new BinaryExpr('notIn', left, right);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.binary(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new BinaryExpr(\n this.op,\n rewriteComparable(this.left, rewriter),\n rewriteComparable(this.right, rewriter),\n );\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(folder, [\n () => foldComparable(this.left, folder),\n () => foldComparable(this.right, folder),\n ]);\n }\n}\n\nexport class AndExpr extends Expression {\n readonly kind = 'and' as const;\n readonly exprs: ReadonlyArray<AnyExpression>;\n\n constructor(exprs: ReadonlyArray<AnyExpression>) {\n super();\n this.exprs = frozenArrayCopy(exprs);\n this.freeze();\n }\n\n static of(exprs: ReadonlyArray<AnyExpression>): AndExpr {\n return new AndExpr(exprs);\n }\n\n static true(): AndExpr {\n return new AndExpr([]);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.and(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new AndExpr(this.exprs.map((expr) => expr.rewrite(rewriter)));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.exprs.map((expr) => () => expr.fold(folder)),\n );\n }\n}\n\nexport class OrExpr extends Expression {\n readonly kind = 'or' as const;\n readonly exprs: ReadonlyArray<AnyExpression>;\n\n constructor(exprs: ReadonlyArray<AnyExpression>) {\n super();\n this.exprs = frozenArrayCopy(exprs);\n this.freeze();\n }\n\n static of(exprs: ReadonlyArray<AnyExpression>): OrExpr {\n return new OrExpr(exprs);\n }\n\n static false(): OrExpr {\n return new OrExpr([]);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.or(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new OrExpr(this.exprs.map((expr) => expr.rewrite(rewriter)));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return combineAll(\n folder,\n this.exprs.map((expr) => () => expr.fold(folder)),\n );\n }\n}\n\nexport class ExistsExpr extends Expression {\n readonly kind = 'exists' as const;\n readonly notExists: boolean;\n readonly subquery: SelectAst;\n\n constructor(subquery: SelectAst, notExists = false) {\n super();\n this.notExists = notExists;\n this.subquery = subquery;\n this.freeze();\n }\n\n static exists(subquery: SelectAst): ExistsExpr {\n return new ExistsExpr(subquery, false);\n }\n\n static notExists(subquery: SelectAst): ExistsExpr {\n return new ExistsExpr(subquery, true);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.exists(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new ExistsExpr(this.subquery.rewrite(rewriter), this.notExists);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return folder.select ? folder.select(this.subquery) : folder.empty;\n }\n}\n\nexport class NullCheckExpr extends Expression {\n readonly kind = 'null-check' as const;\n readonly expr: AnyExpression;\n readonly isNull: boolean;\n\n constructor(expr: AnyExpression, isNull: boolean) {\n super();\n this.expr = expr;\n this.isNull = isNull;\n this.freeze();\n }\n\n static isNull(expr: AnyExpression): NullCheckExpr {\n return new NullCheckExpr(expr, true);\n }\n\n static isNotNull(expr: AnyExpression): NullCheckExpr {\n return new NullCheckExpr(expr, false);\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.nullCheck(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new NullCheckExpr(this.expr.rewrite(rewriter), this.isNull);\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr.fold(folder);\n }\n}\n\nexport class NotExpr extends Expression {\n readonly kind = 'not' as const;\n readonly expr: AnyExpression;\n\n constructor(expr: AnyExpression) {\n super();\n this.expr = expr;\n this.freeze();\n }\n\n toWhereExpr(): AnyExpression {\n return this;\n }\n\n override accept<R>(visitor: ExprVisitor<R>): R {\n return visitor.not(this);\n }\n\n override rewrite(rewriter: ExpressionRewriter): AnyExpression {\n return new NotExpr(this.expr.rewrite(rewriter));\n }\n\n override fold<T>(folder: ExpressionFolder<T>): T {\n return this.expr.fold(folder);\n }\n}\n\nexport class EqColJoinOn extends AstNode {\n readonly kind = 'eq-col-join-on' as const;\n readonly left: ColumnRef;\n readonly right: ColumnRef;\n\n constructor(left: ColumnRef, right: ColumnRef) {\n super();\n this.left = left;\n this.right = right;\n this.freeze();\n }\n\n static of(left: ColumnRef, right: ColumnRef): EqColJoinOn {\n return new EqColJoinOn(left, right);\n }\n\n rewrite(rewriter: AstRewriter): EqColJoinOn | AnyExpression {\n return rewriter.eqColJoinOn ? rewriter.eqColJoinOn(this) : this;\n }\n}\n\nexport class JoinAst extends AstNode {\n readonly kind = 'join' as const;\n readonly joinType: 'inner' | 'left' | 'right' | 'full';\n readonly source: AnyFromSource;\n readonly lateral: boolean;\n readonly on: JoinOnExpr;\n\n constructor(\n joinType: 'inner' | 'left' | 'right' | 'full',\n source: AnyFromSource,\n on: JoinOnExpr,\n lateral = false,\n ) {\n super();\n this.joinType = joinType;\n this.source = source;\n this.lateral = lateral;\n this.on = on;\n this.freeze();\n }\n\n static inner(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('inner', source, on, lateral);\n }\n\n static left(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('left', source, on, lateral);\n }\n\n static right(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('right', source, on, lateral);\n }\n\n static full(source: AnyFromSource, on: JoinOnExpr, lateral = false): JoinAst {\n return new JoinAst('full', source, on, lateral);\n }\n\n rewrite(rewriter: AstRewriter): JoinAst {\n return new JoinAst(\n this.joinType,\n this.source.rewrite(rewriter),\n this.on.kind === 'eq-col-join-on' ? this.on.rewrite(rewriter) : this.on.rewrite(rewriter),\n this.lateral,\n );\n }\n}\n\nexport class ProjectionItem extends AstNode {\n readonly kind = 'projection-item' as const;\n readonly alias: string;\n readonly expr: ProjectionExpr;\n /**\n * Codec identity for the projected cell. Decode-side dispatch resolves the per-instance codec through `contractCodecs.forCodecRef(codec)` — content-keyed memoisation collapses repeated lookups for the same logical column onto one shared {@link Codec}.\n *\n * Stays `undefined` for non-column-bound projections (computed expressions, subqueries, raw aliases) whose decoded type the runtime cannot infer from a single contract column.\n */\n readonly codec: CodecRef | undefined;\n\n constructor(alias: string, expr: ProjectionExpr, codec?: CodecRef) {\n super();\n this.alias = alias;\n this.expr = expr;\n this.codec = codec ? frozenCodecRef(codec) : undefined;\n this.freeze();\n }\n\n static of(alias: string, expr: ProjectionExpr, codec?: CodecRef): ProjectionItem {\n return new ProjectionItem(alias, expr, codec);\n }\n\n withCodec(codec: CodecRef | undefined): ProjectionItem {\n return new ProjectionItem(this.alias, this.expr, codec);\n }\n}\n\nexport interface SelectAstOptions {\n readonly from: AnyFromSource;\n readonly joins: ReadonlyArray<JoinAst> | undefined;\n readonly projection: ReadonlyArray<ProjectionItem>;\n readonly where: AnyExpression | undefined;\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n readonly distinct: true | undefined;\n readonly distinctOn: ReadonlyArray<AnyExpression> | undefined;\n readonly groupBy: ReadonlyArray<AnyExpression> | undefined;\n readonly having: AnyExpression | undefined;\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n readonly selectAllIntent: { readonly table?: string } | undefined;\n}\n\nexport class SelectAst extends QueryAst {\n readonly kind = 'select' as const;\n readonly from: AnyFromSource;\n readonly joins: ReadonlyArray<JoinAst> | undefined;\n readonly projection: ReadonlyArray<ProjectionItem>;\n readonly where: AnyExpression | undefined;\n readonly orderBy: ReadonlyArray<OrderByItem> | undefined;\n readonly distinct: true | undefined;\n readonly distinctOn: ReadonlyArray<AnyExpression> | undefined;\n readonly groupBy: ReadonlyArray<AnyExpression> | undefined;\n readonly having: AnyExpression | undefined;\n readonly limit: number | undefined;\n readonly offset: number | undefined;\n readonly selectAllIntent: { readonly table?: string } | undefined;\n\n constructor(options: SelectAstOptions) {\n super();\n this.from = options.from;\n this.joins =\n options.joins && options.joins.length > 0 ? frozenArrayCopy(options.joins) : undefined;\n this.projection = frozenArrayCopy(options.projection);\n this.where = options.where;\n this.orderBy =\n options.orderBy && options.orderBy.length > 0 ? frozenArrayCopy(options.orderBy) : undefined;\n this.distinct = options.distinct;\n this.distinctOn =\n options.distinctOn && options.distinctOn.length > 0\n ? frozenArrayCopy(options.distinctOn)\n : undefined;\n this.groupBy =\n options.groupBy && options.groupBy.length > 0 ? frozenArrayCopy(options.groupBy) : undefined;\n this.having = options.having;\n this.limit = options.limit;\n this.offset = options.offset;\n this.selectAllIntent = frozenOptionalRecordCopy(options.selectAllIntent);\n this.freeze();\n }\n\n static from(from: AnyFromSource): SelectAst {\n return new SelectAst({\n from,\n joins: undefined,\n projection: [],\n where: undefined,\n orderBy: undefined,\n distinct: undefined,\n distinctOn: undefined,\n groupBy: undefined,\n having: undefined,\n limit: undefined,\n offset: undefined,\n selectAllIntent: undefined,\n });\n }\n\n withFrom(from: AnyFromSource): SelectAst {\n return new SelectAst({ ...this, from });\n }\n\n withJoins(joins: ReadonlyArray<JoinAst>): SelectAst {\n return new SelectAst({\n ...this,\n joins: joins.length > 0 ? joins : undefined,\n });\n }\n\n withProjection(projection: ReadonlyArray<ProjectionItem>): SelectAst {\n return new SelectAst({ ...this, projection });\n }\n\n addProjection(alias: string, expr: ProjectionExpr): SelectAst {\n return new SelectAst({\n ...this,\n projection: [...this.projection, new ProjectionItem(alias, expr)],\n });\n }\n\n withWhere(where: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this, where });\n }\n\n withOrderBy(orderBy: ReadonlyArray<OrderByItem>): SelectAst {\n return new SelectAst({\n ...this,\n orderBy: orderBy.length > 0 ? orderBy : undefined,\n });\n }\n\n withDistinct(enabled = true): SelectAst {\n return new SelectAst({\n ...this,\n distinct: enabled ? true : undefined,\n });\n }\n\n withDistinctOn(distinctOn: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this,\n distinctOn: distinctOn.length > 0 ? distinctOn : undefined,\n });\n }\n\n withGroupBy(groupBy: ReadonlyArray<AnyExpression>): SelectAst {\n return new SelectAst({\n ...this,\n groupBy: groupBy.length > 0 ? groupBy : undefined,\n });\n }\n\n withHaving(having: AnyExpression | undefined): SelectAst {\n return new SelectAst({ ...this, having });\n }\n\n withLimit(limit: number | undefined): SelectAst {\n return new SelectAst({ ...this, limit });\n }\n\n withOffset(offset: number | undefined): SelectAst {\n return new SelectAst({ ...this, offset });\n }\n\n withSelectAllIntent(selectAllIntent: { readonly table?: string } | undefined): SelectAst {\n return new SelectAst({ ...this, selectAllIntent });\n }\n\n rewrite(rewriter: AstRewriter): SelectAst {\n const rewritten = new SelectAst({\n from: this.from.rewrite(rewriter),\n joins: this.joins?.map((join) => join.rewrite(rewriter)),\n projection: this.projection.map(\n (projection) =>\n new ProjectionItem(\n projection.alias,\n projection.expr.kind === 'literal'\n ? rewriter.literal\n ? rewriter.literal(projection.expr)\n : projection.expr\n : projection.expr.rewrite(rewriter),\n projection.codec,\n ),\n ),\n where: this.where?.rewrite(rewriter),\n orderBy: this.orderBy?.map((orderItem) => orderItem.rewrite(rewriter)),\n distinct: this.distinct,\n distinctOn: this.distinctOn?.map((expr) => expr.rewrite(rewriter)),\n groupBy: this.groupBy?.map((expr) => expr.rewrite(rewriter)),\n having: this.having?.rewrite(rewriter),\n limit: this.limit,\n offset: this.offset,\n selectAllIntent: this.selectAllIntent,\n });\n\n return rewriter.select ? rewriter.select(rewritten) : rewritten;\n }\n\n collectColumnRefs(): ColumnRef[] {\n const refs: ColumnRef[] = [];\n const pushRefs = (columns: ReadonlyArray<ColumnRef>) => {\n refs.push(...columns);\n };\n\n if (this.from.kind === 'derived-table-source') {\n pushRefs(this.from.query.collectColumnRefs());\n }\n\n for (const projection of this.projection) {\n if (!(projection.expr.kind === 'literal')) {\n pushRefs(projection.expr.collectColumnRefs());\n }\n }\n\n if (this.where) {\n pushRefs(this.where.collectColumnRefs());\n }\n if (this.having) {\n pushRefs(this.having.collectColumnRefs());\n }\n for (const orderItem of this.orderBy ?? []) {\n pushRefs(orderItem.expr.collectColumnRefs());\n }\n for (const expr of this.distinctOn ?? []) {\n pushRefs(expr.collectColumnRefs());\n }\n for (const expr of this.groupBy ?? []) {\n pushRefs(expr.collectColumnRefs());\n }\n for (const join of this.joins ?? []) {\n if (join.source.kind === 'derived-table-source') {\n pushRefs(join.source.query.collectColumnRefs());\n }\n if (join.on.kind === 'eq-col-join-on') {\n refs.push(join.on.left, join.on.right);\n } else {\n pushRefs(join.on.collectColumnRefs());\n }\n }\n\n return refs;\n }\n\n collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n const pushRefs = (params: ReadonlyArray<ParamRef>) => {\n refs.push(...params);\n };\n\n if (this.from.kind === 'derived-table-source') {\n pushRefs(this.from.query.collectParamRefs());\n }\n\n for (const projection of this.projection) {\n if (!(projection.expr.kind === 'literal')) {\n pushRefs(projection.expr.collectParamRefs());\n }\n }\n\n if (this.where) {\n pushRefs(this.where.collectParamRefs());\n }\n if (this.having) {\n pushRefs(this.having.collectParamRefs());\n }\n for (const orderItem of this.orderBy ?? []) {\n pushRefs(orderItem.expr.collectParamRefs());\n }\n for (const expr of this.distinctOn ?? []) {\n pushRefs(expr.collectParamRefs());\n }\n for (const expr of this.groupBy ?? []) {\n pushRefs(expr.collectParamRefs());\n }\n for (const join of this.joins ?? []) {\n if (join.source.kind === 'derived-table-source') {\n pushRefs(join.source.query.collectParamRefs());\n }\n if (!(join.on.kind === 'eq-col-join-on')) {\n pushRefs(join.on.collectParamRefs());\n }\n }\n\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nabstract class InsertOnConflictAction extends AstNode {\n abstract toInsertOnConflictAction(): AnyInsertOnConflictAction;\n}\n\nexport class DoNothingConflictAction extends InsertOnConflictAction {\n readonly kind = 'do-nothing' as const;\n\n constructor() {\n super();\n this.freeze();\n }\n\n override toInsertOnConflictAction(): AnyInsertOnConflictAction {\n return this;\n }\n}\n\nexport class DoUpdateSetConflictAction extends InsertOnConflictAction {\n readonly kind = 'do-update-set' as const;\n readonly set: Readonly<Record<string, ColumnRef | ParamRef>>;\n\n constructor(set: Readonly<Record<string, ColumnRef | ParamRef>>) {\n super();\n this.set = frozenRecordCopy(set);\n this.freeze();\n }\n\n override toInsertOnConflictAction(): AnyInsertOnConflictAction {\n return this;\n }\n}\n\nexport class InsertOnConflict extends AstNode {\n readonly kind = 'insert-on-conflict' as const;\n readonly columns: ReadonlyArray<ColumnRef>;\n readonly action: AnyInsertOnConflictAction;\n\n constructor(columns: ReadonlyArray<ColumnRef>, action: AnyInsertOnConflictAction) {\n super();\n this.columns = frozenArrayCopy(columns);\n this.action = action;\n this.freeze();\n }\n\n static on(columns: ReadonlyArray<ColumnRef>): InsertOnConflict {\n return new InsertOnConflict(columns, new DoNothingConflictAction());\n }\n\n doNothing(): InsertOnConflict {\n return new InsertOnConflict(this.columns, new DoNothingConflictAction());\n }\n\n doUpdateSet(set: Readonly<Record<string, ColumnRef | ParamRef>>): InsertOnConflict {\n return new InsertOnConflict(this.columns, new DoUpdateSetConflictAction(set));\n }\n}\n\nexport class InsertAst extends QueryAst {\n readonly kind = 'insert' as const;\n readonly table: TableSource;\n readonly rows: ReadonlyArray<Readonly<Record<string, InsertValue>>>;\n readonly onConflict: InsertOnConflict | undefined;\n readonly returning: ReadonlyArray<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n rows: ReadonlyArray<Record<string, InsertValue>> = [{}],\n onConflict?: InsertOnConflict,\n returning?: ReadonlyArray<ProjectionItem>,\n ) {\n super();\n this.table = table;\n this.rows = freezeRows(rows);\n this.onConflict = onConflict;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static into(table: TableSource): InsertAst {\n return new InsertAst(table);\n }\n\n withValues(values: Record<string, InsertValue>): InsertAst {\n return new InsertAst(this.table, [{ ...values }], this.onConflict, this.returning);\n }\n\n withRows(rows: ReadonlyArray<Record<string, InsertValue>>): InsertAst {\n return new InsertAst(\n this.table,\n rows.map((row) => ({ ...row })),\n this.onConflict,\n this.returning,\n );\n }\n\n withReturning(returning: ReadonlyArray<ProjectionItem> | undefined): InsertAst {\n return new InsertAst(\n this.table,\n this.rows.map((row) => ({ ...row })),\n this.onConflict,\n returning,\n );\n }\n\n withOnConflict(onConflict: InsertOnConflict | undefined): InsertAst {\n return new InsertAst(\n this.table,\n this.rows.map((row) => ({ ...row })),\n onConflict,\n this.returning,\n );\n }\n\n rewrite(rewriter: AstRewriter): InsertAst {\n return new InsertAst(\n rewriteTableSource(this.table, rewriter),\n this.rows.map((row) => rewriteInsertRow(row, rewriter)),\n this.onConflict ? rewriteOnConflict(this.onConflict, rewriter) : undefined,\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\n }\n\n override collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n for (const row of this.rows) {\n for (const value of Object.values(row)) {\n if (value.kind === 'param-ref') {\n refs.push(value);\n }\n }\n }\n if (this.onConflict?.action.kind === 'do-update-set') {\n for (const value of Object.values(this.onConflict.action.set)) {\n if (value.kind === 'param-ref') {\n refs.push(value);\n }\n }\n }\n for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport class UpdateAst extends QueryAst {\n readonly kind = 'update' as const;\n readonly table: TableSource;\n readonly set: Readonly<Record<string, ColumnRef | ParamRef>>;\n readonly where: AnyExpression | undefined;\n readonly returning: ReadonlyArray<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n set: Readonly<Record<string, ColumnRef | ParamRef>> = {},\n where?: AnyExpression,\n returning?: ReadonlyArray<ProjectionItem>,\n ) {\n super();\n this.table = table;\n this.set = frozenRecordCopy(set);\n this.where = where;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static table(table: TableSource): UpdateAst {\n return new UpdateAst(table);\n }\n\n withSet(set: Readonly<Record<string, ColumnRef | ParamRef>>): UpdateAst {\n return new UpdateAst(this.table, set, this.where, this.returning);\n }\n\n withWhere(where: AnyExpression | undefined): UpdateAst {\n return new UpdateAst(this.table, this.set, where, this.returning);\n }\n\n withReturning(returning: ReadonlyArray<ProjectionItem> | undefined): UpdateAst {\n return new UpdateAst(this.table, this.set, this.where, returning);\n }\n\n rewrite(rewriter: AstRewriter): UpdateAst {\n return new UpdateAst(\n rewriteTableSource(this.table, rewriter),\n rewriteUpdateSet(this.set, rewriter),\n this.where?.rewrite(rewriter),\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\n }\n\n override collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n for (const value of Object.values(this.set)) {\n if (value.kind === 'param-ref') {\n refs.push(value);\n }\n }\n if (this.where) {\n refs.push(...this.where.collectParamRefs());\n }\n for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport class DeleteAst extends QueryAst {\n readonly kind = 'delete' as const;\n readonly table: TableSource;\n readonly where: AnyExpression | undefined;\n readonly returning: ReadonlyArray<ProjectionItem> | undefined;\n\n constructor(\n table: TableSource,\n where?: AnyExpression,\n returning?: ReadonlyArray<ProjectionItem>,\n ) {\n super();\n this.table = table;\n this.where = where;\n this.returning = returning && returning.length > 0 ? frozenArrayCopy(returning) : undefined;\n this.freeze();\n }\n\n static from(table: TableSource): DeleteAst {\n return new DeleteAst(table);\n }\n\n withWhere(where: AnyExpression | undefined): DeleteAst {\n return new DeleteAst(this.table, where, this.returning);\n }\n\n withReturning(returning: ReadonlyArray<ProjectionItem> | undefined): DeleteAst {\n return new DeleteAst(this.table, this.where, returning);\n }\n\n rewrite(rewriter: AstRewriter): DeleteAst {\n return new DeleteAst(\n rewriteTableSource(this.table, rewriter),\n this.where?.rewrite(rewriter),\n this.returning?.map((item) => rewriteProjectionItem(item, rewriter)),\n );\n }\n\n override collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n if (this.where) {\n refs.push(...this.where.collectParamRefs());\n }\n for (const item of this.returning ?? []) {\n if (item.expr.kind !== 'literal') {\n refs.push(...item.expr.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\n/**\n * Raw-SQL query AST node carrying interpolated parameter / expression nodes\n * embedded inside literal SQL fragments.\n *\n * `fragments` and `args` are interleaved during lowering:\n * `fragments[0] + lower(args[0]) + fragments[1] + ... + fragments[n]`.\n * Construction enforces `fragments.length === args.length + 1`.\n *\n * Extends {@link QueryAst} (whole-query AST, not a sub-expression).\n * Construction does not validate that each arg is a `ParamRef` /\n * `AnyExpression`: the type system already rejects bare values because\n * `args` is typed `readonly AnyExpression[]`. The user-facing `raw\\`...\\``\n * factory (separate `sql-raw-factory` component) layers stricter\n * type-level rejection on top of this AST node.\n */\nexport class RawSqlExpr extends QueryAst {\n readonly kind = 'raw-sql' as const;\n readonly fragments: readonly string[];\n readonly args: readonly AnyExpression[];\n\n constructor(fragments: readonly string[], args: readonly AnyExpression[]) {\n super();\n if (fragments.length !== args.length + 1) {\n throw new Error(\n `RawSqlExpr: fragments.length must equal args.length + 1 (got fragments=${fragments.length}, args=${args.length})`,\n );\n }\n this.fragments = Object.freeze([...fragments]);\n this.args = Object.freeze([...args]);\n this.freeze();\n }\n\n static of(fragments: readonly string[], args: readonly AnyExpression[]): RawSqlExpr {\n return new RawSqlExpr(fragments, args);\n }\n\n override collectParamRefs(): ParamRef[] {\n const refs: ParamRef[] = [];\n for (const arg of this.args) {\n if (arg.kind === 'param-ref') {\n refs.push(arg);\n } else {\n refs.push(...arg.collectParamRefs());\n }\n }\n return refs;\n }\n\n override toQueryAst(): AnyQueryAst {\n return this;\n }\n}\n\nexport type AnyQueryAst = SelectAst | InsertAst | UpdateAst | DeleteAst | RawSqlExpr;\nexport type AnyFromSource = TableSource | DerivedTableSource;\nexport type AnyExpression =\n | ColumnRef\n | IdentifierRef\n | ParamRef\n | LiteralExpr\n | SubqueryExpr\n | OperationExpr\n | AggregateExpr\n | JsonObjectExpr\n | JsonArrayAggExpr\n | ListExpression\n | BinaryExpr\n | AndExpr\n | OrExpr\n | ExistsExpr\n | NullCheckExpr\n | NotExpr;\nexport type AnyInsertOnConflictAction = DoNothingConflictAction | DoUpdateSetConflictAction;\nexport type AnyInsertValue = ColumnRef | ParamRef | DefaultValueExpr;\nexport type AnyOperationArg = AnyExpression | ParamRef | LiteralExpr;\n\nexport const queryAstKinds: ReadonlySet<string> = new Set<AnyQueryAst['kind']>([\n 'select',\n 'insert',\n 'update',\n 'delete',\n 'raw-sql',\n]);\nexport const whereExprKinds: ReadonlySet<string> = new Set<AnyExpression['kind']>([\n 'binary',\n 'and',\n 'or',\n 'exists',\n 'null-check',\n 'not',\n]);\n\nexport function isQueryAst(value: unknown): value is AnyQueryAst {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n queryAstKinds.has((value as { kind: string }).kind)\n );\n}\n\nexport function isWhereExpr(value: unknown): value is AnyExpression {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'kind' in value &&\n whereExprKinds.has((value as { kind: string }).kind)\n );\n}\n\nexport interface ToWhereExpr {\n toWhereExpr(): AnyExpression;\n}\n\nexport interface LoweredStatement {\n readonly sql: string;\n readonly params: readonly unknown[];\n readonly annotations?: Record<string, unknown>;\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { o as CodecRef } from "./codec-types-Cezo7k-i.mjs";
1
2
  import { ParamSpec } from "@prisma-next/operations";
2
3
  import { SqlLoweringSpec } from "@prisma-next/sql-operations";
3
4
 
@@ -123,31 +124,23 @@ declare class IdentifierRef extends Expression {
123
124
  rewrite(rewriter: ExpressionRewriter): AnyExpression;
124
125
  fold<T>(folder: ExpressionFolder<T>): T;
125
126
  }
126
- /**
127
- * Column ref carried by a {@link ParamRef} that was constructed at a column-bound site (e.g. an INSERT/UPDATE column assignment, a `WHERE column = $param` comparison). The encode-side dispatch path uses `refs` to call `contractCodecs.forColumn(refs.table, refs.column)`, which selects the per-instance parameterized codec for the column — required when a parameterized codec id is shared by multiple columns with distinct
128
- * typeParams (e.g. `vector(1024)` vs. `vector(1536)`).
129
- *
130
- * `refs` may legitimately be `undefined` for `ParamRef`s constructed without a column context — the validator pass (`validateParamRefRefs`) treats refs-less ParamRefs as a hard error only when their codec id is parameterized.
131
- */
132
- interface ParamRefBindingRefs {
133
- readonly table: string;
134
- readonly column: string;
135
- }
136
127
  declare class ParamRef extends Expression {
137
128
  readonly kind: "param-ref";
138
129
  readonly value: unknown;
139
130
  readonly name: string | undefined;
140
- readonly codecId: string | undefined;
141
- readonly refs: ParamRefBindingRefs | undefined;
131
+ /**
132
+ * Codec identity carried by every column-bound `ParamRef`. The encode-side dispatch path materialises the per-instance codec through `contractCodecs.forCodecRef(codec)` — content-keyed memoisation on `(codecId, canonicalize(typeParams))` keeps repeated lookups for the same logical column on one shared {@link Codec}.
133
+ *
134
+ * `codec` may be `undefined` for `ParamRef`s constructed without a column-bound site (literals, transient builder state); the runtime treats those as untyped passthroughs.
135
+ */
136
+ readonly codec: CodecRef | undefined;
142
137
  constructor(value: unknown, options?: {
143
138
  name?: string;
144
- codecId?: string;
145
- refs?: ParamRefBindingRefs;
139
+ codec?: CodecRef;
146
140
  });
147
141
  static of(value: unknown, options?: {
148
142
  name?: string;
149
- codecId?: string;
150
- refs?: ParamRefBindingRefs;
143
+ codec?: CodecRef;
151
144
  }): ParamRef;
152
145
  accept<R>(visitor: ExprVisitor<R>): R;
153
146
  rewrite(rewriter: ExpressionRewriter): AnyExpression;
@@ -343,15 +336,15 @@ declare class ProjectionItem extends AstNode {
343
336
  readonly kind: "projection-item";
344
337
  readonly alias: string;
345
338
  readonly expr: ProjectionExpr;
346
- readonly codecId: string | undefined;
347
339
  /**
348
- * Column-bound metadata for the projection. Populated by builder paths that promote a top-level field shortcut (`select('email', ...)`) into a bare `IdentifierRef` AST while still knowing the originating `(table, column)`. Decode-side dispatch consults `refs` to call `forColumn(table, column)` so parameterized codec ids resolve to the per-instance codec — required when multiple columns share a codec id with distinct
349
- * typeParams (e.g. `varchar(36)` vs. `varchar(255)`). Stays `undefined` for `column-ref` projections (the AST already carries the binding) and for non-column-bound projections (computed expressions, subqueries, raw aliases).
340
+ * Codec identity for the projected cell. Decode-side dispatch resolves the per-instance codec through `contractCodecs.forCodecRef(codec)` content-keyed memoisation collapses repeated lookups for the same logical column onto one shared {@link Codec}.
341
+ *
342
+ * Stays `undefined` for non-column-bound projections (computed expressions, subqueries, raw aliases) whose decoded type the runtime cannot infer from a single contract column.
350
343
  */
351
- readonly refs: ParamRefBindingRefs | undefined;
352
- constructor(alias: string, expr: ProjectionExpr, codecId?: string, refs?: ParamRefBindingRefs);
353
- static of(alias: string, expr: ProjectionExpr, codecId?: string, refs?: ParamRefBindingRefs): ProjectionItem;
354
- withCodecId(codecId: string | undefined): ProjectionItem;
344
+ readonly codec: CodecRef | undefined;
345
+ constructor(alias: string, expr: ProjectionExpr, codec?: CodecRef);
346
+ static of(alias: string, expr: ProjectionExpr, codec?: CodecRef): ProjectionItem;
347
+ withCodec(codec: CodecRef | undefined): ProjectionItem;
355
348
  }
356
349
  interface SelectAstOptions {
357
350
  readonly from: AnyFromSource;
@@ -517,5 +510,5 @@ interface LoweredStatement {
517
510
  readonly annotations?: Record<string, unknown>;
518
511
  }
519
512
  //#endregion
520
- export { TableRef as $, InsertOnConflict as A, NotExpr as B, ExistsExpr as C, ExpressionSource as D, ExpressionRewriter as E, JsonObjectEntry as F, ParamRef as G, OperationExpr as H, JsonObjectExpr as I, ProjectionItem as J, ParamRefBindingRefs as K, ListExpression as L, JoinAst as M, JoinOnExpr as N, IdentifierRef as O, JsonArrayAggExpr as P, SubqueryExpr as Q, LiteralExpr as R, EqColJoinOn as S, ExpressionFolder as T, OrExpr as U, NullCheckExpr as V, OrderByItem as W, SelectAst as X, RawSqlExpr as Y, SelectAstOptions as Z, DeleteAst as _, AndExpr as a, isWhereExpr as at, DoNothingConflictAction as b, AnyInsertOnConflictAction as c, AnyQueryAst as d, TableSource as et, AstRewriter as f, DefaultValueExpr as g, ColumnRef as h, AggregateOpFn as i, isQueryAst as it, InsertValue as j, InsertAst as k, AnyInsertValue as l, BinaryOp as m, AggregateExpr as n, UpdateAst as nt, AnyExpression as o, queryAstKinds as ot, BinaryExpr as p, ProjectionExpr as q, AggregateFn as r, WhereArg as rt, AnyFromSource as s, whereExprKinds as st, AggregateCountFn as t, ToWhereExpr as tt, AnyOperationArg as u, DerivedTableSource as v, ExprVisitor as w, DoUpdateSetConflictAction as x, Direction as y, LoweredStatement as z };
521
- //# sourceMappingURL=types-BZcKgaYA.d.mts.map
513
+ export { TableSource as $, InsertOnConflict as A, NotExpr as B, ExistsExpr as C, ExpressionSource as D, ExpressionRewriter as E, JsonObjectEntry as F, ParamRef as G, OperationExpr as H, JsonObjectExpr as I, RawSqlExpr as J, ProjectionExpr as K, ListExpression as L, JoinAst as M, JoinOnExpr as N, IdentifierRef as O, JsonArrayAggExpr as P, TableRef as Q, LiteralExpr as R, EqColJoinOn as S, ExpressionFolder as T, OrExpr as U, NullCheckExpr as V, OrderByItem as W, SelectAstOptions as X, SelectAst as Y, SubqueryExpr as Z, DeleteAst as _, AndExpr as a, queryAstKinds as at, DoNothingConflictAction as b, AnyInsertOnConflictAction as c, AnyQueryAst as d, ToWhereExpr as et, AstRewriter as f, DefaultValueExpr as g, ColumnRef as h, AggregateOpFn as i, isWhereExpr as it, InsertValue as j, InsertAst as k, AnyInsertValue as l, BinaryOp as m, AggregateExpr as n, WhereArg as nt, AnyExpression as o, whereExprKinds as ot, BinaryExpr as p, ProjectionItem as q, AggregateFn as r, isQueryAst as rt, AnyFromSource as s, AggregateCountFn as t, UpdateAst as tt, AnyOperationArg as u, DerivedTableSource as v, ExprVisitor as w, DoUpdateSetConflictAction as x, Direction as y, LoweredStatement as z };
514
+ //# sourceMappingURL=types-juiKe2qf.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-juiKe2qf.d.mts","names":[],"sources":["../src/ast/types.ts"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/sql-relational-core",
3
- "version": "0.6.0-dev.6",
3
+ "version": "0.6.0-dev.8",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -9,21 +9,21 @@
9
9
  "@standard-schema/spec": "^1.1.0",
10
10
  "arktype": "^2.1.29",
11
11
  "ts-toolbelt": "^9.6.0",
12
- "@prisma-next/framework-components": "0.6.0-dev.6",
13
- "@prisma-next/contract": "0.6.0-dev.6",
14
- "@prisma-next/sql-contract": "0.6.0-dev.6",
15
- "@prisma-next/operations": "0.6.0-dev.6",
16
- "@prisma-next/sql-operations": "0.6.0-dev.6",
17
- "@prisma-next/utils": "0.6.0-dev.6"
12
+ "@prisma-next/contract": "0.6.0-dev.8",
13
+ "@prisma-next/framework-components": "0.6.0-dev.8",
14
+ "@prisma-next/operations": "0.6.0-dev.8",
15
+ "@prisma-next/sql-contract": "0.6.0-dev.8",
16
+ "@prisma-next/utils": "0.6.0-dev.8",
17
+ "@prisma-next/sql-operations": "0.6.0-dev.8"
18
18
  },
19
19
  "devDependencies": {
20
20
  "tsdown": "0.22.0",
21
21
  "typescript": "5.9.3",
22
22
  "vitest": "4.1.5",
23
- "@prisma-next/sql-contract-ts": "0.6.0-dev.6",
24
- "@prisma-next/tsconfig": "0.0.0",
25
23
  "@prisma-next/test-utils": "0.0.1",
26
- "@prisma-next/tsdown": "0.0.0"
24
+ "@prisma-next/sql-contract-ts": "0.6.0-dev.8",
25
+ "@prisma-next/tsdown": "0.0.0",
26
+ "@prisma-next/tsconfig": "0.0.0"
27
27
  },
28
28
  "files": [
29
29
  "dist",
@@ -3,12 +3,14 @@ import type {
3
3
  CodecCallContext,
4
4
  CodecDescriptor,
5
5
  CodecInstanceContext,
6
+ CodecRef,
6
7
  CodecTrait,
7
8
  } from '@prisma-next/framework-components/codec';
8
9
 
9
10
  export type {
10
11
  CodecCallContext,
11
12
  CodecDescriptor,
13
+ CodecRef,
12
14
  CodecTrait,
13
15
  } from '@prisma-next/framework-components/codec';
14
16
 
@@ -77,10 +79,9 @@ export interface Codec<
77
79
  /**
78
80
  * Contract-bound codec registry.
79
81
  *
80
- * The dispatch interface for encode/decode at runtime: built once at `ExecutionContext` construction time by walking the contract's `storage.tables[].columns[]` and resolving each column through its descriptor's factory (per-instance for parameterized columns; the cached shared codec for non-parameterized columns). The dispatch path calls `forColumn(table, column).encode/decode(...)` and doesn't know whether the codec
81
- * is parameterized.
82
+ * Built once at `ExecutionContext` construction time by walking the contract's `storage.tables[].columns[]` and resolving each column through its descriptor's factory. Runtime encode/decode dispatch resolves codecs via `forCodecRef(ref)` the single dispatch shape for AST-bound codec resolution.
82
83
  *
83
- * `forCodecId(codecId)` is the refs-less fallback. Every column-bound `ParamRef` carries `refs: { table; column }` and the builder-pipeline `validateParamRefRefs` pass enforces refs on every parameterized `ParamRef` before encode runs, so this fallback is only reached for non-parameterized codec ids.
84
+ * `forColumn(table, column)` is retained for build-time helpers that need column-keyed lookup (e.g. projection stamping); runtime dispatch routes through `forCodecRef`.
84
85
  */
85
86
  export interface ContractCodecRegistry {
86
87
  /**
@@ -89,10 +90,11 @@ export interface ContractCodecRegistry {
89
90
  forColumn(table: string, column: string): Codec | undefined;
90
91
 
91
92
  /**
92
- * Resolve a codec by id. For non-parameterized codecs this returns the canonical shared instance materialized once at context construction; for parameterized codecs it returns the column-resolved instance when a single column declares the codec id, or the `factory(undefined)` representative when the descriptor's factory is parameter-tolerant. Used by refs-less call sites; the validator pass guarantees the call site's
93
- * `codecId` is non-parameterized (or parameter-tolerant) at this boundary.
93
+ * Resolve a codec by {@link CodecRef}. The single dispatch shape for AST-bound codec resolution every codec-bearing AST node carries a `CodecRef` that resolves through this method via the per-`ExecutionContext` `AstCodecResolver`. Two refs with the same `codecId` and structurally equal `typeParams` (regardless of object key order) return the same memoised codec instance. Throws `RUNTIME.CODEC_DESCRIPTOR_MISSING` for unknown `codecId`s and `RUNTIME.TYPE_PARAMS_INVALID` on `paramsSchema` rejection.
94
+ *
95
+ * Pre-populated from the contract walk at registry construction time (so contract-declared codecs hit on first call); grows lazily for AST-supplied refs not seen at contract-load time (deserialised migration ops, refs-less raw SQL with an explicit codec).
94
96
  */
95
- forCodecId(codecId: string): Codec | undefined;
97
+ forCodecRef(ref: CodecRef): Codec;
96
98
  }
97
99
 
98
100
  /**
package/src/ast/types.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ParamSpec } from '@prisma-next/operations';
2
2
  import type { SqlLoweringSpec } from '@prisma-next/sql-operations';
3
+ import type { CodecRef } from './codec-types';
3
4
 
4
5
  export type Direction = 'asc' | 'desc';
5
6
 
@@ -81,6 +82,16 @@ function frozenRecordCopy<T>(record: Readonly<Record<string, T>>): Readonly<Reco
81
82
  return Object.freeze({ ...record });
82
83
  }
83
84
 
85
+ function frozenCodecRef(codec: CodecRef): CodecRef {
86
+ const typeParams =
87
+ codec.typeParams === undefined
88
+ ? undefined
89
+ : (structuredClone(codec.typeParams) as CodecRef['typeParams']);
90
+ return Object.freeze(
91
+ typeParams === undefined ? { codecId: codec.codecId } : { codecId: codec.codecId, typeParams },
92
+ );
93
+ }
94
+
84
95
  function freezeRows(
85
96
  rows: ReadonlyArray<Record<string, InsertValue>>,
86
97
  ): ReadonlyArray<Readonly<Record<string, InsertValue>>> {
@@ -156,7 +167,7 @@ function rewriteProjectionItem(item: ProjectionItem, rewriter: AstRewriter): Pro
156
167
  ? rewriter.literal(item.expr)
157
168
  : item.expr
158
169
  : item.expr.rewrite(rewriter);
159
- return new ProjectionItem(item.alias, rewrittenExpr, item.codecId, item.refs);
170
+ return new ProjectionItem(item.alias, rewrittenExpr, item.codec);
160
171
  }
161
172
 
162
173
  function rewriteInsertValue(value: InsertValue, rewriter: AstRewriter): InsertValue {
@@ -390,37 +401,28 @@ export class IdentifierRef extends Expression {
390
401
  }
391
402
  }
392
403
 
393
- /**
394
- * Column ref carried by a {@link ParamRef} that was constructed at a column-bound site (e.g. an INSERT/UPDATE column assignment, a `WHERE column = $param` comparison). The encode-side dispatch path uses `refs` to call `contractCodecs.forColumn(refs.table, refs.column)`, which selects the per-instance parameterized codec for the column — required when a parameterized codec id is shared by multiple columns with distinct
395
- * typeParams (e.g. `vector(1024)` vs. `vector(1536)`).
396
- *
397
- * `refs` may legitimately be `undefined` for `ParamRef`s constructed without a column context — the validator pass (`validateParamRefRefs`) treats refs-less ParamRefs as a hard error only when their codec id is parameterized.
398
- */
399
- export interface ParamRefBindingRefs {
400
- readonly table: string;
401
- readonly column: string;
402
- }
403
-
404
404
  export class ParamRef extends Expression {
405
405
  readonly kind = 'param-ref' as const;
406
406
  readonly value: unknown;
407
407
  readonly name: string | undefined;
408
- readonly codecId: string | undefined;
409
- readonly refs: ParamRefBindingRefs | undefined;
408
+ /**
409
+ * Codec identity carried by every column-bound `ParamRef`. The encode-side dispatch path materialises the per-instance codec through `contractCodecs.forCodecRef(codec)` — content-keyed memoisation on `(codecId, canonicalize(typeParams))` keeps repeated lookups for the same logical column on one shared {@link Codec}.
410
+ *
411
+ * `codec` may be `undefined` for `ParamRef`s constructed without a column-bound site (literals, transient builder state); the runtime treats those as untyped passthroughs.
412
+ */
413
+ readonly codec: CodecRef | undefined;
410
414
 
411
415
  constructor(
412
416
  value: unknown,
413
417
  options?: {
414
418
  name?: string;
415
- codecId?: string;
416
- refs?: ParamRefBindingRefs;
419
+ codec?: CodecRef;
417
420
  },
418
421
  ) {
419
422
  super();
420
423
  this.value = value;
421
424
  this.name = options?.name;
422
- this.codecId = options?.codecId;
423
- this.refs = options?.refs ? Object.freeze({ ...options.refs }) : undefined;
425
+ this.codec = options?.codec ? frozenCodecRef(options.codec) : undefined;
424
426
  this.freeze();
425
427
  }
426
428
 
@@ -428,8 +430,7 @@ export class ParamRef extends Expression {
428
430
  value: unknown,
429
431
  options?: {
430
432
  name?: string;
431
- codecId?: string;
432
- refs?: ParamRefBindingRefs;
433
+ codec?: CodecRef;
433
434
  },
434
435
  ): ParamRef {
435
436
  return new ParamRef(value, options);
@@ -1081,33 +1082,27 @@ export class ProjectionItem extends AstNode {
1081
1082
  readonly kind = 'projection-item' as const;
1082
1083
  readonly alias: string;
1083
1084
  readonly expr: ProjectionExpr;
1084
- readonly codecId: string | undefined;
1085
1085
  /**
1086
- * Column-bound metadata for the projection. Populated by builder paths that promote a top-level field shortcut (`select('email', ...)`) into a bare `IdentifierRef` AST while still knowing the originating `(table, column)`. Decode-side dispatch consults `refs` to call `forColumn(table, column)` so parameterized codec ids resolve to the per-instance codec — required when multiple columns share a codec id with distinct
1087
- * typeParams (e.g. `varchar(36)` vs. `varchar(255)`). Stays `undefined` for `column-ref` projections (the AST already carries the binding) and for non-column-bound projections (computed expressions, subqueries, raw aliases).
1086
+ * Codec identity for the projected cell. Decode-side dispatch resolves the per-instance codec through `contractCodecs.forCodecRef(codec)` content-keyed memoisation collapses repeated lookups for the same logical column onto one shared {@link Codec}.
1087
+ *
1088
+ * Stays `undefined` for non-column-bound projections (computed expressions, subqueries, raw aliases) whose decoded type the runtime cannot infer from a single contract column.
1088
1089
  */
1089
- readonly refs: ParamRefBindingRefs | undefined;
1090
+ readonly codec: CodecRef | undefined;
1090
1091
 
1091
- constructor(alias: string, expr: ProjectionExpr, codecId?: string, refs?: ParamRefBindingRefs) {
1092
+ constructor(alias: string, expr: ProjectionExpr, codec?: CodecRef) {
1092
1093
  super();
1093
1094
  this.alias = alias;
1094
1095
  this.expr = expr;
1095
- this.codecId = codecId;
1096
- this.refs = refs ? Object.freeze({ ...refs }) : undefined;
1096
+ this.codec = codec ? frozenCodecRef(codec) : undefined;
1097
1097
  this.freeze();
1098
1098
  }
1099
1099
 
1100
- static of(
1101
- alias: string,
1102
- expr: ProjectionExpr,
1103
- codecId?: string,
1104
- refs?: ParamRefBindingRefs,
1105
- ): ProjectionItem {
1106
- return new ProjectionItem(alias, expr, codecId, refs);
1100
+ static of(alias: string, expr: ProjectionExpr, codec?: CodecRef): ProjectionItem {
1101
+ return new ProjectionItem(alias, expr, codec);
1107
1102
  }
1108
1103
 
1109
- withCodecId(codecId: string | undefined): ProjectionItem {
1110
- return new ProjectionItem(this.alias, this.expr, codecId, this.refs);
1104
+ withCodec(codec: CodecRef | undefined): ProjectionItem {
1105
+ return new ProjectionItem(this.alias, this.expr, codec);
1111
1106
  }
1112
1107
  }
1113
1108
 
@@ -1264,8 +1259,7 @@ export class SelectAst extends QueryAst {
1264
1259
  ? rewriter.literal(projection.expr)
1265
1260
  : projection.expr
1266
1261
  : projection.expr.rewrite(rewriter),
1267
- projection.codecId,
1268
- projection.refs,
1262
+ projection.codec,
1269
1263
  ),
1270
1264
  ),
1271
1265
  where: this.where?.rewrite(rewriter),
@@ -1,5 +1,7 @@
1
- import type { CodecDescriptor } from '@prisma-next/framework-components/codec';
1
+ import type { CodecDescriptor, CodecRef } from '@prisma-next/framework-components/codec';
2
+ import type { SqlStorage } from '@prisma-next/sql-contract/types';
2
3
  import type { AnyCodecDescriptor } from './ast/codec-types';
4
+ import { codecRefForStorageColumn } from './codec-ref-for-column';
3
5
  import type { CodecDescriptorRegistry } from './query-lane-context';
4
6
 
5
7
  /**
@@ -14,6 +16,7 @@ import type { CodecDescriptorRegistry } from './query-lane-context';
14
16
  */
15
17
  export function buildCodecDescriptorRegistry(
16
18
  allDescriptors: ReadonlyArray<AnyCodecDescriptor>,
19
+ storage?: SqlStorage,
17
20
  ): CodecDescriptorRegistry {
18
21
  type AnyDescriptor = CodecDescriptor<unknown>;
19
22
  const byId = new Map<string, AnyDescriptor>();
@@ -42,6 +45,10 @@ export function buildCodecDescriptorRegistry(
42
45
  descriptorFor(codecId: string): AnyDescriptor | undefined {
43
46
  return byId.get(codecId);
44
47
  },
48
+ codecRefForColumn(table: string, column: string): CodecRef | undefined {
49
+ if (!storage) return undefined;
50
+ return codecRefForStorageColumn(storage, table, column);
51
+ },
45
52
  *values(): IterableIterator<AnyDescriptor> {
46
53
  yield* byId.values();
47
54
  },
@@ -0,0 +1,34 @@
1
+ import type { JsonValue } from '@prisma-next/contract/types';
2
+ import type { CodecRef } from '@prisma-next/framework-components/codec';
3
+ import type { SqlStorage } from '@prisma-next/sql-contract/types';
4
+
5
+ /**
6
+ * Derive the canonical {@link CodecRef} for a `(table, column)` pair against a {@link SqlStorage}. This is the build-time path every column-bound `ParamRef` / `ProjectionItem` uses to stamp its `codec` slot before the AST is handed to the runtime — the runtime resolver then materialises a memoised {@link import('@prisma-next/sql-relational-core/ast').Codec} for the same `CodecRef` via `forCodecRef`.
7
+ *
8
+ * Resolution rules over `storage.tables[table].columns[column]`:
9
+ *
10
+ * - `typeRef` column → `{codecId, typeParams}` from `storage.types[typeRef]` (multiple columns sharing the typeRef share one ref → one memoised codec).
11
+ * - inline `typeParams` column → `{codecId, typeParams}` from the column itself.
12
+ * - non-parameterized column → `{codecId}` with `typeParams` undefined.
13
+ *
14
+ * Returns `undefined` when the table or column is unknown, or when a `typeRef` column references a `storage.types` entry that does not exist.
15
+ */
16
+ export function codecRefForStorageColumn(
17
+ storage: SqlStorage,
18
+ tableName: string,
19
+ columnName: string,
20
+ ): CodecRef | undefined {
21
+ const tableDef = storage.tables[tableName];
22
+ if (!tableDef) return undefined;
23
+ const columnDef = tableDef.columns[columnName];
24
+ if (!columnDef) return undefined;
25
+ if (columnDef.typeRef !== undefined) {
26
+ const instance = storage.types?.[columnDef.typeRef];
27
+ if (!instance) return undefined;
28
+ return { codecId: instance.codecId, typeParams: instance.typeParams as JsonValue };
29
+ }
30
+ if (columnDef.typeParams !== undefined) {
31
+ return { codecId: columnDef.codecId, typeParams: columnDef.typeParams as JsonValue };
32
+ }
33
+ return { codecId: columnDef.codecId };
34
+ }
@@ -5,4 +5,3 @@ export * from '../ast/sql-codec-helpers';
5
5
  export * from '../ast/sql-codecs';
6
6
  export * from '../ast/types';
7
7
  export * from '../ast/util';
8
- export * from '../ast/validate-param-refs';
@@ -1 +1,2 @@
1
1
  export * from '../codec-descriptor-registry';
2
+ export * from '../codec-ref-for-column';