{"version":3,"sources":["../../src/query-builder/index.ts","../../src/query-builder/expressions.ts","../../src/query-builder/builder.ts","../../src/query-builder/schema.ts"],"sourcesContent":["/**\n * Type-safe Query Builder for postgres.do\n *\n * A standalone query builder with full TypeScript type inference.\n * Works alongside Drizzle ORM and provides an alternative API for building queries.\n *\n * @example Basic usage\n * ```typescript\n * import { createQueryBuilder, defineTable, text, serial, eq } from 'postgres.do/query-builder'\n * import postgres from 'postgres.do'\n *\n * // Define schema\n * const users = defineTable('users', {\n *   id: serial('id').primaryKey(),\n *   name: text('name').notNull(),\n *   email: text('email').notNull(),\n * })\n *\n * // Create query builder\n * const sql = postgres('postgres://db.postgres.do/mydb')\n * const qb = createQueryBuilder(sql)\n *\n * // Type-safe queries\n * const allUsers = await qb.select().from(users).execute()\n * // typeof allUsers = { id: number; name: string; email: string }[]\n *\n * const filtered = await qb\n *   .select({ email: users.columns.email })\n *   .from(users)\n *   .where(eq(col('users', 'id'), 1))\n *   .execute()\n * // typeof filtered = { email: string }[]\n * ```\n *\n * @example With Drizzle schema\n * ```typescript\n * import { createQueryBuilder, fromDrizzleTable } from 'postgres.do/query-builder'\n * import { users as drizzleUsers } from './drizzle-schema'\n *\n * const users = fromDrizzleTable(drizzleUsers)\n * const qb = createQueryBuilder(sql)\n *\n * // Use existing Drizzle schema with query builder\n * const results = await qb.select().from(users).execute()\n * ```\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Query Builder Factory\n// ============================================================================\n\nexport { createQueryBuilder } from './builder.js'\n\n// ============================================================================\n// Expression Builders\n// ============================================================================\n\nexport {\n  // Comparison operators\n  eq,\n  ne,\n  lt,\n  lte,\n  gt,\n  gte,\n  like,\n  ilike,\n  inArray,\n  notInArray,\n  isNull,\n  isNotNull,\n  between,\n  notBetween,\n\n  // Logical operators\n  and,\n  or,\n  not,\n\n  // Aggregate functions\n  count,\n  countDistinct,\n  sum,\n  avg,\n  min,\n  max,\n\n  // String functions\n  concat,\n  lower,\n  upper,\n  trim,\n  coalesce,\n\n  // Helpers\n  col,\n  columnsOf,\n  raw,\n  literal,\n  sql,\n} from './expressions.js'\n\n// ============================================================================\n// Schema Definition\n// ============================================================================\n\nexport {\n  // Table definition\n  defineTable,\n\n  // Column types\n  serial,\n  bigserial,\n  integer,\n  bigint,\n  text,\n  varchar,\n  boolean,\n  timestamp,\n  timestamptz,\n  date,\n  time,\n  uuid,\n  json,\n  jsonb,\n  numeric,\n  real,\n  doublePrecision,\n\n  // Drizzle adapter\n  fromDrizzleTable,\n  type DrizzleAdapterOptions,\n\n  // Type helpers\n  type SelectResult,\n  type InsertType,\n  type ColumnKeys,\n} from './schema.js'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type {\n  // Core types\n  TableDefinition,\n  ColumnDefinition,\n  InferTableRow,\n  InferInsertRow,\n\n  // Expression types\n  SQLExpression,\n  ColumnRef,\n  ComparisonOperator,\n  AggregateExpr,\n\n  // Query builder interfaces\n  QueryBuilder,\n  SelectQueryBuilder,\n  InsertQueryBuilder,\n  UpdateQueryBuilder,\n  DeleteQueryBuilder,\n  JoinQueryBuilder,\n\n  // Selection and filtering\n  SelectionSpec,\n  WhereClause,\n  OrderBySpec,\n  ColumnRefs,\n\n  // Join types\n  JoinType,\n  JoinCondition,\n  JoinResult,\n  JoinedTables,\n\n  // Insert/Update types\n  InsertValues,\n  UpdateSet,\n  OnConflictAction,\n  ConflictTarget,\n\n  // Inference helpers\n  InferSelectResult,\n  InferColumnType,\n\n  // Factory interface\n  QueryBuilderFactory,\n} from './types.js'\n","/**\n * Type-safe SQL Expression Builders\n *\n * Provides builder functions for creating type-safe SQL expressions.\n * All comparisons are validated at compile time.\n */\n\nimport type {\n  SQLExpression,\n  ColumnRef,\n  ComparisonOperator,\n  AggregateExpr,\n  TableDefinition,\n  ColumnRefs,\n} from './types.js'\n\n// ============================================================================\n// Expression Implementation\n// ============================================================================\n\n/**\n * Internal implementation of SQL expression\n */\nclass SQLExpressionImpl<TType = unknown> implements SQLExpression<TType> {\n  readonly _type!: TType\n  readonly _brand = 'sql_expression' as const\n\n  constructor(\n    private sqlGen: () => { sql: string; params: unknown[] }\n  ) {}\n\n  toSQL(): { sql: string; params: unknown[] } {\n    return this.sqlGen()\n  }\n}\n\n/**\n * Column reference implementation\n */\nclass ColumnRefImpl<\n  TTable extends string,\n  TColumn extends string,\n  TType,\n> extends SQLExpressionImpl<TType> implements ColumnRef<TTable, TColumn, TType> {\n  readonly table: TTable\n  readonly column: TColumn\n\n  constructor(table: TTable, column: TColumn) {\n    super(() => ({\n      sql: `\"${this.table}\".\"${this.column}\"`,\n      params: [],\n    }))\n    this.table = table\n    this.column = column\n  }\n}\n\n/**\n * Literal value implementation\n */\nclass LiteralImpl<TType> extends SQLExpressionImpl<TType> {\n  readonly value: TType\n\n  constructor(value: TType, private paramIndex: () => number) {\n    super(() => ({\n      sql: `$${this.paramIndex()}`,\n      params: [this.value],\n    }))\n    this.value = value\n  }\n}\n\n// ============================================================================\n// Comparison Operators\n// ============================================================================\n\n/**\n * Create an equality comparison (=)\n */\nexport function eq<TType>(\n  left: SQLExpression<TType>,\n  right: TType | SQLExpression<TType>\n): SQLExpression<boolean> {\n  return createComparison(left, '=', right)\n}\n\n/**\n * Create an inequality comparison (!=)\n */\nexport function ne<TType>(\n  left: SQLExpression<TType>,\n  right: TType | SQLExpression<TType>\n): SQLExpression<boolean> {\n  return createComparison(left, '!=', right)\n}\n\n/**\n * Create a less than comparison (<)\n */\nexport function lt<TType>(\n  left: SQLExpression<TType>,\n  right: TType | SQLExpression<TType>\n): SQLExpression<boolean> {\n  return createComparison(left, '<', right)\n}\n\n/**\n * Create a less than or equal comparison (<=)\n */\nexport function lte<TType>(\n  left: SQLExpression<TType>,\n  right: TType | SQLExpression<TType>\n): SQLExpression<boolean> {\n  return createComparison(left, '<=', right)\n}\n\n/**\n * Create a greater than comparison (>)\n */\nexport function gt<TType>(\n  left: SQLExpression<TType>,\n  right: TType | SQLExpression<TType>\n): SQLExpression<boolean> {\n  return createComparison(left, '>', right)\n}\n\n/**\n * Create a greater than or equal comparison (>=)\n */\nexport function gte<TType>(\n  left: SQLExpression<TType>,\n  right: TType | SQLExpression<TType>\n): SQLExpression<boolean> {\n  return createComparison(left, '>=', right)\n}\n\n/**\n * Create a LIKE comparison\n */\nexport function like(\n  column: SQLExpression<string>,\n  pattern: string\n): SQLExpression<boolean> {\n  return createComparison(column, 'LIKE', pattern)\n}\n\n/**\n * Create a case-insensitive LIKE comparison (ILIKE)\n */\nexport function ilike(\n  column: SQLExpression<string>,\n  pattern: string\n): SQLExpression<boolean> {\n  return createComparison(column, 'ILIKE', pattern)\n}\n\n/**\n * Create an IN comparison\n */\nexport function inArray<TType>(\n  column: SQLExpression<TType>,\n  values: TType[]\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const colSql = column.toSQL()\n    const placeholders = values.map((_, i) => `$${colSql.params.length + i + 1}`).join(', ')\n    return {\n      sql: `${colSql.sql} IN (${placeholders})`,\n      params: [...colSql.params, ...values],\n    }\n  })\n}\n\n/**\n * Create a NOT IN comparison\n */\nexport function notInArray<TType>(\n  column: SQLExpression<TType>,\n  values: TType[]\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const colSql = column.toSQL()\n    const placeholders = values.map((_, i) => `$${colSql.params.length + i + 1}`).join(', ')\n    return {\n      sql: `${colSql.sql} NOT IN (${placeholders})`,\n      params: [...colSql.params, ...values],\n    }\n  })\n}\n\n/**\n * Create an IS NULL comparison\n */\nexport function isNull<TType>(\n  column: SQLExpression<TType | null>\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const colSql = column.toSQL()\n    return {\n      sql: `${colSql.sql} IS NULL`,\n      params: colSql.params,\n    }\n  })\n}\n\n/**\n * Create an IS NOT NULL comparison\n */\nexport function isNotNull<TType>(\n  column: SQLExpression<TType | null>\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const colSql = column.toSQL()\n    return {\n      sql: `${colSql.sql} IS NOT NULL`,\n      params: colSql.params,\n    }\n  })\n}\n\n/**\n * Create a BETWEEN comparison\n */\nexport function between<TType>(\n  column: SQLExpression<TType>,\n  min: TType,\n  max: TType\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const colSql = column.toSQL()\n    return {\n      sql: `${colSql.sql} BETWEEN $${colSql.params.length + 1} AND $${colSql.params.length + 2}`,\n      params: [...colSql.params, min, max],\n    }\n  })\n}\n\n/**\n * Create a NOT BETWEEN comparison\n */\nexport function notBetween<TType>(\n  column: SQLExpression<TType>,\n  min: TType,\n  max: TType\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const colSql = column.toSQL()\n    return {\n      sql: `${colSql.sql} NOT BETWEEN $${colSql.params.length + 1} AND $${colSql.params.length + 2}`,\n      params: [...colSql.params, min, max],\n    }\n  })\n}\n\n// ============================================================================\n// Logical Operators\n// ============================================================================\n\n/**\n * Create an AND expression\n */\nexport function and(\n  ...expressions: SQLExpression<boolean>[]\n): SQLExpression<boolean> {\n  if (expressions.length === 0) {\n    return new SQLExpressionImpl<boolean>(() => ({ sql: 'TRUE', params: [] }))\n  }\n  if (expressions.length === 1) {\n    return expressions[0]!\n  }\n\n  return new SQLExpressionImpl<boolean>(() => {\n    const parts: string[] = []\n    const params: unknown[] = []\n\n    for (const expr of expressions) {\n      const { sql, params: exprParams } = expr.toSQL()\n      // Adjust parameter placeholders\n      const adjustedSql = sql.replace(/\\$(\\d+)/g, (_, n) => `$${parseInt(n) + params.length}`)\n      parts.push(`(${adjustedSql})`)\n      params.push(...exprParams)\n    }\n\n    return {\n      sql: parts.join(' AND '),\n      params,\n    }\n  })\n}\n\n/**\n * Create an OR expression\n */\nexport function or(\n  ...expressions: SQLExpression<boolean>[]\n): SQLExpression<boolean> {\n  if (expressions.length === 0) {\n    return new SQLExpressionImpl<boolean>(() => ({ sql: 'FALSE', params: [] }))\n  }\n  if (expressions.length === 1) {\n    return expressions[0]!\n  }\n\n  return new SQLExpressionImpl<boolean>(() => {\n    const parts: string[] = []\n    const params: unknown[] = []\n\n    for (const expr of expressions) {\n      const { sql, params: exprParams } = expr.toSQL()\n      // Adjust parameter placeholders\n      const adjustedSql = sql.replace(/\\$(\\d+)/g, (_, n) => `$${parseInt(n) + params.length}`)\n      parts.push(`(${adjustedSql})`)\n      params.push(...exprParams)\n    }\n\n    return {\n      sql: parts.join(' OR '),\n      params,\n    }\n  })\n}\n\n/**\n * Create a NOT expression\n */\nexport function not(\n  expression: SQLExpression<boolean>\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const { sql, params } = expression.toSQL()\n    return {\n      sql: `NOT (${sql})`,\n      params,\n    }\n  })\n}\n\n// ============================================================================\n// Aggregate Functions\n// ============================================================================\n\n/**\n * Create a COUNT aggregate\n */\nexport function count(): AggregateExpr<number>\nexport function count<TType>(column: SQLExpression<TType>): AggregateExpr<number>\nexport function count<TType>(column?: SQLExpression<TType>): AggregateExpr<number> {\n  return createAggregate('COUNT', column ?? '*')\n}\n\n/**\n * Create a COUNT DISTINCT aggregate\n */\nexport function countDistinct<TType>(column: SQLExpression<TType>): AggregateExpr<number> {\n  return createAggregate('COUNT', column, true)\n}\n\n/**\n * Create a SUM aggregate\n */\nexport function sum(column: SQLExpression<number>): AggregateExpr<number> {\n  return createAggregate('SUM', column)\n}\n\n/**\n * Create an AVG aggregate\n */\nexport function avg(column: SQLExpression<number>): AggregateExpr<number> {\n  return createAggregate('AVG', column)\n}\n\n/**\n * Create a MIN aggregate\n */\nexport function min<TType>(column: SQLExpression<TType>): AggregateExpr<TType> {\n  return createAggregate('MIN', column)\n}\n\n/**\n * Create a MAX aggregate\n */\nexport function max<TType>(column: SQLExpression<TType>): AggregateExpr<TType> {\n  return createAggregate('MAX', column)\n}\n\n// ============================================================================\n// String Functions\n// ============================================================================\n\n/**\n * Create a CONCAT expression\n */\nexport function concat(\n  ...values: (SQLExpression<string> | string)[]\n): SQLExpression<string> {\n  return new SQLExpressionImpl<string>(() => {\n    const parts: string[] = []\n    const params: unknown[] = []\n\n    for (const value of values) {\n      if (typeof value === 'string') {\n        parts.push(`$${params.length + 1}`)\n        params.push(value)\n      } else {\n        const { sql, params: exprParams } = value.toSQL()\n        const adjustedSql = sql.replace(/\\$(\\d+)/g, (_, n) => `$${parseInt(n) + params.length}`)\n        parts.push(adjustedSql)\n        params.push(...exprParams)\n      }\n    }\n\n    return {\n      sql: `CONCAT(${parts.join(', ')})`,\n      params,\n    }\n  })\n}\n\n/**\n * Create a LOWER expression\n */\nexport function lower(value: SQLExpression<string>): SQLExpression<string> {\n  return new SQLExpressionImpl<string>(() => {\n    const { sql, params } = value.toSQL()\n    return {\n      sql: `LOWER(${sql})`,\n      params,\n    }\n  })\n}\n\n/**\n * Create an UPPER expression\n */\nexport function upper(value: SQLExpression<string>): SQLExpression<string> {\n  return new SQLExpressionImpl<string>(() => {\n    const { sql, params } = value.toSQL()\n    return {\n      sql: `UPPER(${sql})`,\n      params,\n    }\n  })\n}\n\n/**\n * Create a TRIM expression\n */\nexport function trim(value: SQLExpression<string>): SQLExpression<string> {\n  return new SQLExpressionImpl<string>(() => {\n    const { sql, params } = value.toSQL()\n    return {\n      sql: `TRIM(${sql})`,\n      params,\n    }\n  })\n}\n\n/**\n * Create a COALESCE expression\n */\nexport function coalesce<TType>(\n  ...values: (SQLExpression<TType | null> | TType)[]\n): SQLExpression<TType> {\n  return new SQLExpressionImpl<TType>(() => {\n    const parts: string[] = []\n    const params: unknown[] = []\n\n    for (const value of values) {\n      if (typeof value === 'object' && value !== null && '_brand' in value) {\n        const expr = value as SQLExpression<TType | null>\n        const { sql, params: exprParams } = expr.toSQL()\n        const adjustedSql = sql.replace(/\\$(\\d+)/g, (_, n) => `$${parseInt(n) + params.length}`)\n        parts.push(adjustedSql)\n        params.push(...exprParams)\n      } else {\n        parts.push(`$${params.length + 1}`)\n        params.push(value)\n      }\n    }\n\n    return {\n      sql: `COALESCE(${parts.join(', ')})`,\n      params,\n    }\n  })\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create a column reference\n */\nexport function col<\n  TTable extends string,\n  TColumn extends string,\n  TType = unknown,\n>(table: TTable, column: TColumn): ColumnRef<TTable, TColumn, TType> {\n  return new ColumnRefImpl<TTable, TColumn, TType>(table, column)\n}\n\n/**\n * Create column references for a table definition\n */\nexport function columnsOf<T extends TableDefinition>(table: T): ColumnRefs<T> {\n  const refs = {} as ColumnRefs<T>\n\n  for (const key of Object.keys(table.columns)) {\n    const columnDef = table.columns[key]!\n    refs[key as keyof typeof refs] = new ColumnRefImpl(\n      table.tableName,\n      columnDef.name\n    ) as ColumnRefs<T>[keyof typeof refs]\n  }\n\n  return refs\n}\n\n/**\n * Create a raw SQL expression (use with caution!)\n */\nexport function raw<TType = unknown>(\n  sql: string,\n  params: unknown[] = []\n): SQLExpression<TType> {\n  return new SQLExpressionImpl<TType>(() => ({ sql, params }))\n}\n\n/**\n * Create a literal value expression\n */\nexport function literal<TType>(value: TType): SQLExpression<TType> {\n  let paramIdx = 1\n  return new LiteralImpl(value, () => paramIdx++)\n}\n\n/**\n * Create a SQL expression from a template literal\n */\nexport function sql<TType = unknown>(\n  strings: TemplateStringsArray,\n  ...values: unknown[]\n): SQLExpression<TType> {\n  return new SQLExpressionImpl<TType>(() => {\n    const parts: string[] = []\n    const params: unknown[] = []\n\n    for (let i = 0; i < strings.length; i++) {\n      parts.push(strings[i]!)\n      if (i < values.length) {\n        const value = values[i]\n        if (typeof value === 'object' && value !== null && '_brand' in value) {\n          const expr = value as SQLExpression\n          const { sql, params: exprParams } = expr.toSQL()\n          const adjustedSql = sql.replace(/\\$(\\d+)/g, (_, n) => `$${parseInt(n) + params.length}`)\n          parts.push(adjustedSql)\n          params.push(...exprParams)\n        } else {\n          parts.push(`$${params.length + 1}`)\n          params.push(value)\n        }\n      }\n    }\n\n    return {\n      sql: parts.join(''),\n      params,\n    }\n  })\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\nfunction createComparison<TType>(\n  left: SQLExpression<TType>,\n  operator: ComparisonOperator,\n  right: TType | SQLExpression<TType>\n): SQLExpression<boolean> {\n  return new SQLExpressionImpl<boolean>(() => {\n    const leftSql = left.toSQL()\n    let rightSql: { sql: string; params: unknown[] }\n\n    if (typeof right === 'object' && right !== null && '_brand' in right) {\n      const rightExpr = right as SQLExpression<TType>\n      const { sql, params } = rightExpr.toSQL()\n      // Adjust parameter indices\n      rightSql = {\n        sql: sql.replace(/\\$(\\d+)/g, (_, n) => `$${parseInt(n) + leftSql.params.length}`),\n        params,\n      }\n    } else {\n      rightSql = {\n        sql: `$${leftSql.params.length + 1}`,\n        params: [right],\n      }\n    }\n\n    return {\n      sql: `${leftSql.sql} ${operator} ${rightSql.sql}`,\n      params: [...leftSql.params, ...rightSql.params],\n    }\n  })\n}\n\nfunction createAggregate<TType>(\n  fn: 'COUNT' | 'SUM' | 'AVG' | 'MIN' | 'MAX',\n  column: SQLExpression | '*',\n  distinct = false\n): AggregateExpr<TType> {\n  const baseExpr = new SQLExpressionImpl<TType>(() => {\n    if (column === '*') {\n      return {\n        sql: `${fn}(*)`,\n        params: [],\n      }\n    }\n\n    const { sql, params } = column.toSQL()\n    const distinctClause = distinct ? 'DISTINCT ' : ''\n    return {\n      sql: `${fn}(${distinctClause}${sql})`,\n      params,\n    }\n  })\n\n  // Create aggregate expression with required properties\n  const aggregateExpr = baseExpr as unknown as AggregateExpr<TType>\n\n  // Add aggregate properties\n  Object.defineProperties(aggregateExpr, {\n    fn: { value: fn, writable: false, enumerable: true },\n    column: { value: column, writable: false, enumerable: true },\n    distinct: { value: distinct, writable: false, enumerable: true },\n  })\n\n  return aggregateExpr\n}\n","/**\n * Type-safe Query Builder Implementation\n *\n * Full implementation of the query builder with type-safe SQL generation.\n */\n\nimport type { Sql, Row } from '../types.js'\nimport type {\n  TableDefinition,\n  SelectionSpec,\n  WhereClause,\n  OrderBySpec,\n  JoinType,\n  JoinCondition,\n  InsertValues,\n  UpdateSet,\n  OnConflictAction,\n  ConflictTarget,\n  SQLExpression,\n  SelectQueryBuilder,\n  InsertQueryBuilder,\n  UpdateQueryBuilder,\n  DeleteQueryBuilder,\n  JoinQueryBuilder,\n  InferSelectResult,\n  InferTableRow,\n  JoinResult,\n  ColumnRefs as _ColumnRefs,\n} from './types.js'\nimport { columnsOf, and } from './expressions.js'\n\n// ============================================================================\n// SELECT Query Builder Implementation\n// ============================================================================\n\nclass SelectQueryBuilderImpl<\n  T extends TableDefinition,\n  TSelection extends SelectionSpec<T> = '*',\n  TResult = InferSelectResult<T, TSelection>[],\n> implements SelectQueryBuilder<T, TSelection, TResult> {\n  private _distinct = false\n  private _selection: TSelection = '*' as TSelection\n  private _where: SQLExpression<boolean>[] = []\n  private _orderBy: { column: string; direction: 'ASC' | 'DESC'; nulls?: 'FIRST' | 'LAST' | undefined }[] = []\n  private _limit?: number | undefined\n  private _offset?: number | undefined\n  private _groupBy: string[] = []\n  private _having?: SQLExpression<boolean> | undefined\n\n  constructor(\n    private client: Sql,\n    private table: T\n  ) {}\n\n  select<TNewSelection extends SelectionSpec<T>>(\n    selection: TNewSelection\n  ): SelectQueryBuilder<T, TNewSelection, InferSelectResult<T, TNewSelection>[]> {\n    const builder = new SelectQueryBuilderImpl<T, TNewSelection>(this.client, this.table)\n    builder._distinct = this._distinct\n    builder._selection = selection\n    builder._where = [...this._where]\n    builder._orderBy = [...this._orderBy]\n    builder._limit = this._limit\n    builder._offset = this._offset\n    builder._groupBy = [...this._groupBy]\n    builder._having = this._having\n    return builder as SelectQueryBuilder<T, TNewSelection, InferSelectResult<T, TNewSelection>[]>\n  }\n\n  where(condition: WhereClause<T>): SelectQueryBuilder<T, TSelection, TResult> {\n    const expr = this.resolveWhereClause(condition)\n    this._where = [expr]\n    return this\n  }\n\n  andWhere(condition: WhereClause<T>): SelectQueryBuilder<T, TSelection, TResult> {\n    const expr = this.resolveWhereClause(condition)\n    this._where.push(expr)\n    return this\n  }\n\n  orWhere(condition: WhereClause<T>): SelectQueryBuilder<T, TSelection, TResult> {\n    if (this._where.length === 0) {\n      return this.where(condition)\n    }\n\n    const existingConditions = this._where.length === 1 ? this._where[0]! : and(...this._where)\n    const newCondition = this.resolveWhereClause(condition)\n\n    // Create OR expression\n    const orExpr: SQLExpression<boolean> = {\n      _type: true as boolean,\n      _brand: 'sql_expression',\n      toSQL: () => {\n        const leftSql = existingConditions.toSQL()\n        const rightSql = newCondition.toSQL()\n        // Adjust right-side parameter indices\n        const adjustedRightSql = rightSql.sql.replace(\n          /\\$(\\d+)/g,\n          (_, n) => `$${parseInt(n) + leftSql.params.length}`\n        )\n        return {\n          sql: `(${leftSql.sql}) OR (${adjustedRightSql})`,\n          params: [...leftSql.params, ...rightSql.params],\n        }\n      },\n    }\n\n    this._where = [orExpr]\n    return this\n  }\n\n  orderBy(...specs: OrderBySpec<T>[]): SelectQueryBuilder<T, TSelection, TResult> {\n    for (const spec of specs) {\n      if (typeof spec === 'string') {\n        this._orderBy.push({ column: spec, direction: 'ASC' })\n      } else if (typeof spec === 'object') {\n        this._orderBy.push({\n          column: spec.column as string,\n          direction: spec.direction,\n          nulls: 'nulls' in spec ? spec.nulls : undefined,\n        })\n      }\n    }\n    return this\n  }\n\n  limit(count: number): SelectQueryBuilder<T, TSelection, TResult> {\n    this._limit = count\n    return this\n  }\n\n  offset(count: number): SelectQueryBuilder<T, TSelection, TResult> {\n    this._offset = count\n    return this\n  }\n\n  groupBy(...columns: (keyof T['columns'])[]): SelectQueryBuilder<T, TSelection, TResult> {\n    this._groupBy.push(...columns.map(c => String(c)))\n    return this\n  }\n\n  having(condition: SQLExpression<boolean>): SelectQueryBuilder<T, TSelection, TResult> {\n    this._having = condition\n    return this\n  }\n\n  distinct(): SelectQueryBuilder<T, TSelection, TResult> {\n    this._distinct = true\n    return this\n  }\n\n  toSQL(): { sql: string; params: unknown[] } {\n    const params: unknown[] = []\n    const parts: string[] = []\n\n    // SELECT\n    parts.push('SELECT')\n    if (this._distinct) {\n      parts.push('DISTINCT')\n    }\n\n    // Columns\n    const columns = this.buildSelectColumns(params)\n    parts.push(columns)\n\n    // FROM\n    parts.push(`FROM \"${this.table.tableName}\"`)\n\n    // WHERE\n    if (this._where.length > 0) {\n      const whereExpr = this._where.length === 1 ? this._where[0]! : and(...this._where)\n      const { sql, params: whereParams } = whereExpr.toSQL()\n      // Adjust parameter indices\n      const adjustedSql = sql.replace(\n        /\\$(\\d+)/g,\n        (_, n) => `$${parseInt(n) + params.length}`\n      )\n      parts.push(`WHERE ${adjustedSql}`)\n      params.push(...whereParams)\n    }\n\n    // GROUP BY\n    if (this._groupBy.length > 0) {\n      parts.push(`GROUP BY ${this._groupBy.map(c => `\"${c}\"`).join(', ')}`)\n    }\n\n    // HAVING\n    if (this._having) {\n      const { sql, params: havingParams } = this._having.toSQL()\n      const adjustedSql = sql.replace(\n        /\\$(\\d+)/g,\n        (_, n) => `$${parseInt(n) + params.length}`\n      )\n      parts.push(`HAVING ${adjustedSql}`)\n      params.push(...havingParams)\n    }\n\n    // ORDER BY\n    if (this._orderBy.length > 0) {\n      const orderClauses = this._orderBy.map(o => {\n        let clause = `\"${o.column}\" ${o.direction}`\n        if (o.nulls) {\n          clause += ` NULLS ${o.nulls}`\n        }\n        return clause\n      })\n      parts.push(`ORDER BY ${orderClauses.join(', ')}`)\n    }\n\n    // LIMIT\n    if (this._limit !== undefined) {\n      parts.push(`LIMIT ${this._limit}`)\n    }\n\n    // OFFSET\n    if (this._offset !== undefined) {\n      parts.push(`OFFSET ${this._offset}`)\n    }\n\n    return { sql: parts.join(' '), params }\n  }\n\n  async execute(): Promise<TResult> {\n    const { sql, params } = this.toSQL()\n    const result = await this.client.unsafe<Row>(sql, params)\n    return result as TResult\n  }\n\n  async first(): Promise<TResult extends (infer U)[] ? U | null : TResult | null> {\n    const limitedBuilder = this.limit(1)\n    const result = await limitedBuilder.execute()\n    if (Array.isArray(result)) {\n      return (result[0] ?? null) as TResult extends (infer U)[] ? U | null : TResult | null\n    }\n    return result as TResult extends (infer U)[] ? U | null : TResult | null\n  }\n\n  async firstOrThrow(): Promise<TResult extends (infer U)[] ? U : TResult> {\n    const result = await this.first()\n    if (result === null) {\n      throw new Error('No result found')\n    }\n    return result as TResult extends (infer U)[] ? U : TResult\n  }\n\n  private resolveWhereClause(condition: WhereClause<T>): SQLExpression<boolean> {\n    if (typeof condition === 'function') {\n      const refs = columnsOf(this.table)\n      return condition(refs)\n    }\n    return condition\n  }\n\n  private buildSelectColumns(_params: unknown[]): string {\n    if (this._selection === '*') {\n      return '*'\n    }\n\n    if (Array.isArray(this._selection)) {\n      return (this._selection as string[]).map(c => `\"${c}\"`).join(', ')\n    }\n\n    // Object selection with aliases\n    const selectObj = this._selection as Record<string, SQLExpression | string>\n    const columns: string[] = []\n\n    for (const [alias, value] of Object.entries(selectObj)) {\n      if (typeof value === 'string') {\n        columns.push(`\"${value}\" AS \"${alias}\"`)\n      } else {\n        const { sql } = value.toSQL()\n        columns.push(`${sql} AS \"${alias}\"`)\n      }\n    }\n\n    return columns.join(', ')\n  }\n}\n\n// ============================================================================\n// JOIN Query Builder Implementation\n// ============================================================================\n\nclass JoinQueryBuilderImpl<\n  TLeft extends TableDefinition,\n  TRight extends TableDefinition,\n  TJoinType extends JoinType,\n  TResult = JoinResult<TLeft, TRight, TJoinType>[],\n> implements JoinQueryBuilder<TLeft, TRight, TJoinType, TResult> {\n  private _where?: SQLExpression<boolean> | undefined\n  private _orderBy: { column: string; direction: 'ASC' | 'DESC' }[] = []\n  private _limit?: number | undefined\n  private _selection?: Record<string, SQLExpression> | undefined\n\n  constructor(\n    private client: Sql,\n    private leftTable: TLeft,\n    private rightTable: TRight,\n    private joinType: TJoinType,\n    private joinCondition: SQLExpression<boolean>\n  ) {}\n\n  where(condition: SQLExpression<boolean>): JoinQueryBuilder<TLeft, TRight, TJoinType, TResult> {\n    this._where = condition\n    return this\n  }\n\n  orderBy(column: string, direction: 'ASC' | 'DESC' = 'ASC'): JoinQueryBuilder<TLeft, TRight, TJoinType, TResult> {\n    this._orderBy.push({ column, direction })\n    return this\n  }\n\n  limit(count: number): JoinQueryBuilder<TLeft, TRight, TJoinType, TResult> {\n    this._limit = count\n    return this\n  }\n\n  select<TSelection extends Record<string, SQLExpression>>(\n    selection: TSelection\n  ): JoinQueryBuilder<TLeft, TRight, TJoinType, { [K in keyof TSelection]: TSelection[K] extends SQLExpression<infer U> ? U : never }[]> {\n    const builder = new JoinQueryBuilderImpl<TLeft, TRight, TJoinType>(\n      this.client,\n      this.leftTable,\n      this.rightTable,\n      this.joinType,\n      this.joinCondition\n    )\n    builder._where = this._where\n    builder._orderBy = [...this._orderBy]\n    builder._limit = this._limit\n    builder._selection = selection\n    return builder as unknown as JoinQueryBuilder<TLeft, TRight, TJoinType, { [K in keyof TSelection]: TSelection[K] extends SQLExpression<infer U> ? U : never }[]>\n  }\n\n  toSQL(): { sql: string; params: unknown[] } {\n    const params: unknown[] = []\n    const parts: string[] = []\n\n    // SELECT\n    parts.push('SELECT')\n    if (this._selection) {\n      const columns: string[] = []\n      for (const [alias, expr] of Object.entries(this._selection)) {\n        const { sql, params: exprParams } = expr.toSQL()\n        const adjustedSql = sql.replace(\n          /\\$(\\d+)/g,\n          (_, n) => `$${parseInt(n) + params.length}`\n        )\n        columns.push(`${adjustedSql} AS \"${alias}\"`)\n        params.push(...exprParams)\n      }\n      parts.push(columns.join(', '))\n    } else {\n      parts.push(`\"${this.leftTable.tableName}\".*, \"${this.rightTable.tableName}\".*`)\n    }\n\n    // FROM\n    parts.push(`FROM \"${this.leftTable.tableName}\"`)\n\n    // JOIN\n    const joinKeyword = this.getJoinKeyword()\n    parts.push(`${joinKeyword} \"${this.rightTable.tableName}\"`)\n\n    // ON\n    const { sql: onSql, params: onParams } = this.joinCondition.toSQL()\n    const adjustedOnSql = onSql.replace(\n      /\\$(\\d+)/g,\n      (_, n) => `$${parseInt(n) + params.length}`\n    )\n    parts.push(`ON ${adjustedOnSql}`)\n    params.push(...onParams)\n\n    // WHERE\n    if (this._where) {\n      const { sql, params: whereParams } = this._where.toSQL()\n      const adjustedSql = sql.replace(\n        /\\$(\\d+)/g,\n        (_, n) => `$${parseInt(n) + params.length}`\n      )\n      parts.push(`WHERE ${adjustedSql}`)\n      params.push(...whereParams)\n    }\n\n    // ORDER BY\n    if (this._orderBy.length > 0) {\n      const orderClauses = this._orderBy.map(o => `${o.column} ${o.direction}`)\n      parts.push(`ORDER BY ${orderClauses.join(', ')}`)\n    }\n\n    // LIMIT\n    if (this._limit !== undefined) {\n      parts.push(`LIMIT ${this._limit}`)\n    }\n\n    return { sql: parts.join(' '), params }\n  }\n\n  async execute(): Promise<TResult> {\n    const { sql, params } = this.toSQL()\n    const result = await this.client.unsafe<Row>(sql, params)\n    return result as TResult\n  }\n\n  private getJoinKeyword(): string {\n    switch (this.joinType) {\n      case 'LEFT':\n        return 'LEFT JOIN'\n      case 'RIGHT':\n        return 'RIGHT JOIN'\n      case 'FULL':\n        return 'FULL OUTER JOIN'\n      default:\n        return 'INNER JOIN'\n    }\n  }\n}\n\n// ============================================================================\n// INSERT Query Builder Implementation\n// ============================================================================\n\nclass InsertQueryBuilderImpl<\n  T extends TableDefinition,\n  TResult = { rowCount: number },\n> implements InsertQueryBuilder<T, TResult> {\n  private _returning?: string[] | true\n  private _onConflict?: {\n    target: ConflictTarget<T>\n    action: OnConflictAction<T>\n  }\n\n  constructor(\n    private client: Sql,\n    private table: T,\n    private values: InsertValues<T>\n  ) {}\n\n  returning(): InsertQueryBuilder<T, InferTableRow<T>[]>\n  returning<TColumns extends (keyof T['columns'])[]>(\n    ...columns: TColumns\n  ): InsertQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]>\n  returning<TColumns extends (keyof T['columns'])[]>(\n    ...columns: TColumns\n  ): InsertQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]> | InsertQueryBuilder<T, InferTableRow<T>[]> {\n    if (columns.length === 0) {\n      this._returning = true\n    } else {\n      this._returning = columns.map(c => String(c))\n    }\n    return this as unknown as InsertQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]>\n  }\n\n  onConflict(\n    target: ConflictTarget<T>,\n    action: OnConflictAction<T>\n  ): InsertQueryBuilder<T, TResult> {\n    this._onConflict = { target, action }\n    return this\n  }\n\n  toSQL(): { sql: string; params: unknown[] } {\n    const params: unknown[] = []\n    const valuesArray = Array.isArray(this.values) ? this.values : [this.values]\n\n    if (valuesArray.length === 0) {\n      throw new Error('INSERT requires at least one value')\n    }\n\n    // Get column names from first row\n    const columns = Object.keys(valuesArray[0] as Record<string, unknown>)\n    const columnList = columns.map(c => `\"${c}\"`).join(', ')\n\n    // Build value placeholders\n    const valuePlaceholders: string[] = []\n    for (const row of valuesArray) {\n      const rowRecord = row as Record<string, unknown>\n      const rowParams = columns.map(col => rowRecord[col])\n      const placeholders = rowParams.map((_, i) => `$${params.length + i + 1}`).join(', ')\n      valuePlaceholders.push(`(${placeholders})`)\n      params.push(...rowParams)\n    }\n\n    let sql = `INSERT INTO \"${this.table.tableName}\" (${columnList}) VALUES ${valuePlaceholders.join(', ')}`\n\n    // ON CONFLICT\n    if (this._onConflict) {\n      const { target, action } = this._onConflict\n\n      // Build target\n      let targetSql: string\n      if (Array.isArray(target)) {\n        targetSql = target.map(c => `\"${String(c)}\"`).join(', ')\n      } else {\n        targetSql = `ON CONSTRAINT \"${target.constraint}\"`\n      }\n\n      // Build action\n      if (action === 'DO NOTHING') {\n        sql += ` ON CONFLICT (${targetSql}) DO NOTHING`\n      } else if (typeof action === 'object' && 'doUpdate' in action) {\n        const updateSet = action.doUpdate\n        if (typeof updateSet === 'function') {\n          throw new Error('Function-based conflict updates not yet implemented')\n        }\n\n        const setClauses: string[] = []\n        for (const [col, val] of Object.entries(updateSet as Record<string, unknown>)) {\n          setClauses.push(`\"${col}\" = $${params.length + 1}`)\n          params.push(val)\n        }\n\n        sql += ` ON CONFLICT (${targetSql}) DO UPDATE SET ${setClauses.join(', ')}`\n      }\n    }\n\n    // RETURNING\n    if (this._returning) {\n      if (this._returning === true) {\n        sql += ' RETURNING *'\n      } else {\n        sql += ` RETURNING ${this._returning.map(c => `\"${c}\"`).join(', ')}`\n      }\n    }\n\n    return { sql, params }\n  }\n\n  async execute(): Promise<TResult> {\n    const { sql, params } = this.toSQL()\n    const result = await this.client.unsafe<Row>(sql, params)\n\n    if (this._returning) {\n      return result as TResult\n    }\n\n    return { rowCount: result.length || 1 } as TResult\n  }\n}\n\n// ============================================================================\n// UPDATE Query Builder Implementation\n// ============================================================================\n\nclass UpdateQueryBuilderImpl<\n  T extends TableDefinition,\n  TResult = { rowCount: number },\n> implements UpdateQueryBuilder<T, TResult> {\n  private _where?: SQLExpression<boolean>\n  private _returning?: string[] | true\n\n  constructor(\n    private client: Sql,\n    private table: T,\n    private setValues: UpdateSet<T>\n  ) {}\n\n  where(condition: WhereClause<T>): UpdateQueryBuilder<T, TResult> {\n    if (typeof condition === 'function') {\n      const refs = columnsOf(this.table)\n      this._where = condition(refs)\n    } else {\n      this._where = condition\n    }\n    return this\n  }\n\n  returning(): UpdateQueryBuilder<T, InferTableRow<T>[]>\n  returning<TColumns extends (keyof T['columns'])[]>(\n    ...columns: TColumns\n  ): UpdateQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]>\n  returning<TColumns extends (keyof T['columns'])[]>(\n    ...columns: TColumns\n  ): UpdateQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]> | UpdateQueryBuilder<T, InferTableRow<T>[]> {\n    if (columns.length === 0) {\n      this._returning = true\n    } else {\n      this._returning = columns.map(c => String(c))\n    }\n    return this as unknown as UpdateQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]>\n  }\n\n  toSQL(): { sql: string; params: unknown[] } {\n    const params: unknown[] = []\n    const setClauses: string[] = []\n\n    for (const [col, val] of Object.entries(this.setValues as Record<string, unknown>)) {\n      if (val !== undefined) {\n        if (typeof val === 'object' && val !== null && '_brand' in val) {\n          // SQL expression\n          const expr = val as SQLExpression\n          const { sql, params: exprParams } = expr.toSQL()\n          const adjustedSql = sql.replace(\n            /\\$(\\d+)/g,\n            (_, n) => `$${parseInt(n) + params.length}`\n          )\n          setClauses.push(`\"${col}\" = ${adjustedSql}`)\n          params.push(...exprParams)\n        } else {\n          setClauses.push(`\"${col}\" = $${params.length + 1}`)\n          params.push(val)\n        }\n      }\n    }\n\n    if (setClauses.length === 0) {\n      throw new Error('UPDATE requires at least one column to set')\n    }\n\n    let sql = `UPDATE \"${this.table.tableName}\" SET ${setClauses.join(', ')}`\n\n    // WHERE\n    if (this._where) {\n      const { sql: whereSql, params: whereParams } = this._where.toSQL()\n      const adjustedSql = whereSql.replace(\n        /\\$(\\d+)/g,\n        (_, n) => `$${parseInt(n) + params.length}`\n      )\n      sql += ` WHERE ${adjustedSql}`\n      params.push(...whereParams)\n    }\n\n    // RETURNING\n    if (this._returning) {\n      if (this._returning === true) {\n        sql += ' RETURNING *'\n      } else {\n        sql += ` RETURNING ${this._returning.map(c => `\"${c}\"`).join(', ')}`\n      }\n    }\n\n    return { sql, params }\n  }\n\n  async execute(): Promise<TResult> {\n    const { sql, params } = this.toSQL()\n    const result = await this.client.unsafe<Row>(sql, params)\n\n    if (this._returning) {\n      return result as TResult\n    }\n\n    return { rowCount: result.length || 0 } as TResult\n  }\n}\n\n// ============================================================================\n// DELETE Query Builder Implementation\n// ============================================================================\n\nclass DeleteQueryBuilderImpl<\n  T extends TableDefinition,\n  TResult = { rowCount: number },\n> implements DeleteQueryBuilder<T, TResult> {\n  private _where?: SQLExpression<boolean>\n  private _returning?: string[] | true\n\n  constructor(\n    private client: Sql,\n    private table: T\n  ) {}\n\n  where(condition: WhereClause<T>): DeleteQueryBuilder<T, TResult> {\n    if (typeof condition === 'function') {\n      const refs = columnsOf(this.table)\n      this._where = condition(refs)\n    } else {\n      this._where = condition\n    }\n    return this\n  }\n\n  returning(): DeleteQueryBuilder<T, InferTableRow<T>[]>\n  returning<TColumns extends (keyof T['columns'])[]>(\n    ...columns: TColumns\n  ): DeleteQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]>\n  returning<TColumns extends (keyof T['columns'])[]>(\n    ...columns: TColumns\n  ): DeleteQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]> | DeleteQueryBuilder<T, InferTableRow<T>[]> {\n    if (columns.length === 0) {\n      this._returning = true\n    } else {\n      this._returning = columns.map(c => String(c))\n    }\n    return this as unknown as DeleteQueryBuilder<T, Pick<InferTableRow<T>, TColumns[number]>[]>\n  }\n\n  toSQL(): { sql: string; params: unknown[] } {\n    const params: unknown[] = []\n    let sql = `DELETE FROM \"${this.table.tableName}\"`\n\n    // WHERE\n    if (this._where) {\n      const { sql: whereSql, params: whereParams } = this._where.toSQL()\n      const adjustedSql = whereSql.replace(\n        /\\$(\\d+)/g,\n        (_, n) => `$${parseInt(n) + params.length}`\n      )\n      sql += ` WHERE ${adjustedSql}`\n      params.push(...whereParams)\n    }\n\n    // RETURNING\n    if (this._returning) {\n      if (this._returning === true) {\n        sql += ' RETURNING *'\n      } else {\n        sql += ` RETURNING ${this._returning.map(c => `\"${c}\"`).join(', ')}`\n      }\n    }\n\n    return { sql, params }\n  }\n\n  async execute(): Promise<TResult> {\n    const { sql, params } = this.toSQL()\n    const result = await this.client.unsafe<Row>(sql, params)\n\n    if (this._returning) {\n      return result as TResult\n    }\n\n    return { rowCount: result.length || 0 } as TResult\n  }\n}\n\n// ============================================================================\n// Query Builder Factory\n// ============================================================================\n\n/**\n * Create a query builder factory from a postgres.do client\n */\nexport function createQueryBuilder(client: Sql) {\n  return {\n    /**\n     * Start a SELECT query\n     */\n    select<T extends TableDefinition, TSelection extends SelectionSpec<T> = '*'>(\n      selection?: TSelection\n    ): { from(table: T): SelectQueryBuilder<T, TSelection extends undefined ? '*' : TSelection> } {\n      return {\n        from(table: T) {\n          const builder = new SelectQueryBuilderImpl<T>(client, table)\n          if (selection !== undefined) {\n            return builder.select(selection) as unknown as SelectQueryBuilder<T, TSelection extends undefined ? '*' : TSelection>\n          }\n          return builder as unknown as SelectQueryBuilder<T, TSelection extends undefined ? '*' : TSelection>\n        },\n      }\n    },\n\n    /**\n     * Start an INSERT query\n     */\n    insert<T extends TableDefinition>(table: T) {\n      return {\n        values(values: InsertValues<T>) {\n          return new InsertQueryBuilderImpl(client, table, values)\n        },\n      }\n    },\n\n    /**\n     * Start an UPDATE query\n     */\n    update<T extends TableDefinition>(table: T) {\n      return {\n        set(values: UpdateSet<T>) {\n          return new UpdateQueryBuilderImpl(client, table, values)\n        },\n      }\n    },\n\n    /**\n     * Start a DELETE query\n     */\n    delete<T extends TableDefinition>(table: T): DeleteQueryBuilder<T> {\n      return new DeleteQueryBuilderImpl(client, table)\n    },\n\n    /**\n     * Create an INNER JOIN\n     */\n    join<TLeft extends TableDefinition, TRight extends TableDefinition>(\n      left: TLeft,\n      right: TRight,\n      condition: JoinCondition<TLeft, TRight>\n    ): JoinQueryBuilder<TLeft, TRight, 'INNER'> {\n      const expr = resolveJoinCondition(left, right, condition)\n      return new JoinQueryBuilderImpl(client, left, right, 'INNER', expr)\n    },\n\n    /**\n     * Create a LEFT JOIN\n     */\n    leftJoin<TLeft extends TableDefinition, TRight extends TableDefinition>(\n      left: TLeft,\n      right: TRight,\n      condition: JoinCondition<TLeft, TRight>\n    ): JoinQueryBuilder<TLeft, TRight, 'LEFT'> {\n      const expr = resolveJoinCondition(left, right, condition)\n      return new JoinQueryBuilderImpl(client, left, right, 'LEFT', expr)\n    },\n\n    /**\n     * Create a RIGHT JOIN\n     */\n    rightJoin<TLeft extends TableDefinition, TRight extends TableDefinition>(\n      left: TLeft,\n      right: TRight,\n      condition: JoinCondition<TLeft, TRight>\n    ): JoinQueryBuilder<TLeft, TRight, 'RIGHT'> {\n      const expr = resolveJoinCondition(left, right, condition)\n      return new JoinQueryBuilderImpl(client, left, right, 'RIGHT', expr)\n    },\n\n    /**\n     * Create a FULL OUTER JOIN\n     */\n    fullJoin<TLeft extends TableDefinition, TRight extends TableDefinition>(\n      left: TLeft,\n      right: TRight,\n      condition: JoinCondition<TLeft, TRight>\n    ): JoinQueryBuilder<TLeft, TRight, 'FULL'> {\n      const expr = resolveJoinCondition(left, right, condition)\n      return new JoinQueryBuilderImpl(client, left, right, 'FULL', expr)\n    },\n  }\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction resolveJoinCondition<\n  TLeft extends TableDefinition,\n  TRight extends TableDefinition,\n>(\n  left: TLeft,\n  right: TRight,\n  condition: JoinCondition<TLeft, TRight>\n): SQLExpression<boolean> {\n  if ('_brand' in condition) {\n    return condition as SQLExpression<boolean>\n  }\n\n  // Object format: { left: 'userId', right: 'id' }\n  const leftCol = String(condition.left)\n  const rightCol = String(condition.right)\n\n  return {\n    _type: true as boolean,\n    _brand: 'sql_expression',\n    toSQL: () => ({\n      sql: `\"${left.tableName}\".\"${leftCol}\" = \"${right.tableName}\".\"${rightCol}\"`,\n      params: [],\n    }),\n  }\n}\n","/**\n * Type-safe Schema Definition\n *\n * Provides helpers for defining schemas that work with the query builder.\n * Also includes adapters for Drizzle ORM schemas.\n */\n\nimport type {\n  TableDefinition,\n  ColumnDefinition,\n  InferTableRow,\n  InferInsertRow,\n} from './types.js'\n\n// ============================================================================\n// Column Type Definitions\n// ============================================================================\n\n/**\n * PostgreSQL column types mapped to TypeScript types\n */\nexport type PgTypeMap = {\n  // Numeric types\n  'int2': number\n  'int4': number\n  'int8': bigint\n  'float4': number\n  'float8': number\n  'numeric': number\n  'serial': number\n  'bigserial': bigint\n\n  // String types\n  'text': string\n  'varchar': string\n  'char': string\n  'uuid': string\n  'citext': string\n\n  // Boolean\n  'boolean': boolean\n\n  // Date/time\n  'date': Date | string\n  'time': string\n  'timestamp': Date\n  'timestamptz': Date\n  'interval': string\n\n  // JSON\n  'json': unknown\n  'jsonb': unknown\n\n  // Binary\n  'bytea': Uint8Array\n\n  // Arrays (generalized)\n  'array': unknown[]\n\n  // Other\n  'inet': string\n  'cidr': string\n  'macaddr': string\n}\n\nexport type PgType = keyof PgTypeMap\n\n// ============================================================================\n// Column Builder\n// ============================================================================\n\n/**\n * Column builder for type-safe column definitions\n */\nclass ColumnBuilder<\n  TName extends string,\n  TType,\n  TNotNull extends boolean = false,\n  TDefault extends boolean = false,\n> {\n  private _name: TName\n  private _notNull: TNotNull = false as TNotNull\n  private _hasDefault: TDefault = false as TDefault\n\n  constructor(name: TName, private _type: TType) {\n    this._name = name\n  }\n\n  /**\n   * Mark column as NOT NULL\n   */\n  notNull(): ColumnBuilder<TName, TType, true, TDefault> {\n    const builder = new ColumnBuilder<TName, TType, true, TDefault>(this._name, this._type)\n    builder._notNull = true as true\n    builder._hasDefault = this._hasDefault\n    return builder\n  }\n\n  /**\n   * Mark column as having a default value\n   */\n  default<TValue extends TType>(_value: TValue): ColumnBuilder<TName, TType, TNotNull, true> {\n    const builder = new ColumnBuilder<TName, TType, TNotNull, true>(this._name, this._type)\n    builder._notNull = this._notNull\n    builder._hasDefault = true as true\n    return builder\n  }\n\n  /**\n   * Mark as primary key (implies NOT NULL)\n   */\n  primaryKey(): ColumnBuilder<TName, TType, true, TDefault> {\n    return this.notNull()\n  }\n\n  /**\n   * Build the column definition\n   */\n  build(): ColumnDefinition<TName, TType, TNotNull, TDefault> {\n    return {\n      name: this._name,\n      dataType: this._type as TType,\n      notNull: this._notNull,\n      hasDefault: this._hasDefault,\n      _columnBrand: 'column',\n    }\n  }\n}\n\n// ============================================================================\n// Column Type Helpers\n// ============================================================================\n\n/**\n * Create a serial (auto-incrementing integer) column\n */\nexport function serial<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, number, true, true>(name, 0 as number)\n    .notNull()\n    .default(0)\n}\n\n/**\n * Create a bigserial (auto-incrementing bigint) column\n */\nexport function bigserial<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, bigint, true, true>(name, BigInt(0))\n    .notNull()\n    .default(BigInt(0))\n}\n\n/**\n * Create an integer column\n */\nexport function integer<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, number>(name, 0 as number)\n}\n\n/**\n * Create a bigint column\n */\nexport function bigint<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, bigint>(name, BigInt(0))\n}\n\n/**\n * Create a text column\n */\nexport function text<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, string>(name, '' as string)\n}\n\n/**\n * Create a varchar column\n */\nexport function varchar<TName extends string>(name: TName, _length?: number) {\n  return new ColumnBuilder<TName, string>(name, '' as string)\n}\n\n/**\n * Create a boolean column\n */\nexport function boolean<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, boolean>(name, false as boolean)\n}\n\n/**\n * Create a timestamp column\n */\nexport function timestamp<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, Date>(name, new Date() as Date)\n}\n\n/**\n * Create a timestamp with timezone column\n */\nexport function timestamptz<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, Date>(name, new Date() as Date)\n}\n\n/**\n * Create a date column\n */\nexport function date<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, Date | string>(name, '' as Date | string)\n}\n\n/**\n * Create a time column\n */\nexport function time<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, string>(name, '' as string)\n}\n\n/**\n * Create a UUID column\n */\nexport function uuid<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, string>(name, '' as string)\n}\n\n/**\n * Create a JSON column\n */\nexport function json<TName extends string, TData = unknown>(name: TName) {\n  return new ColumnBuilder<TName, TData>(name, undefined as TData)\n}\n\n/**\n * Create a JSONB column\n */\nexport function jsonb<TName extends string, TData = unknown>(name: TName) {\n  return new ColumnBuilder<TName, TData>(name, undefined as TData)\n}\n\n/**\n * Create a numeric/decimal column\n */\nexport function numeric<TName extends string>(name: TName, _precision?: number, _scale?: number) {\n  return new ColumnBuilder<TName, number>(name, 0 as number)\n}\n\n/**\n * Create a real (float4) column\n */\nexport function real<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, number>(name, 0 as number)\n}\n\n/**\n * Create a double precision (float8) column\n */\nexport function doublePrecision<TName extends string>(name: TName) {\n  return new ColumnBuilder<TName, number>(name, 0 as number)\n}\n\n// ============================================================================\n// Table Definition\n// ============================================================================\n\ntype ColumnBuilderMap = Record<string, ColumnBuilder<string, unknown, boolean, boolean>>\n\ntype ExtractColumnDefs<T extends ColumnBuilderMap> = {\n  [K in keyof T]: T[K] extends ColumnBuilder<infer TName, infer TType, infer TNotNull, infer TDefault>\n    ? ColumnDefinition<TName & string, TType, TNotNull, TDefault>\n    : never\n}\n\n/**\n * Define a table with type-safe columns\n */\nexport function defineTable<\n  TName extends string,\n  TColumns extends ColumnBuilderMap,\n>(\n  name: TName,\n  columns: TColumns\n): TableDefinition<TName, ExtractColumnDefs<TColumns>> {\n  const columnDefs = {} as ExtractColumnDefs<TColumns>\n\n  for (const [key, builder] of Object.entries(columns)) {\n    columnDefs[key as keyof TColumns] = builder.build() as ExtractColumnDefs<TColumns>[keyof TColumns]\n  }\n\n  return {\n    tableName: name,\n    columns: columnDefs,\n    _tableBrand: 'table',\n  }\n}\n\n// ============================================================================\n// Drizzle ORM Adapter\n// ============================================================================\n\n/**\n * Options for converting Drizzle schema to query builder format\n */\nexport interface DrizzleAdapterOptions {\n  /**\n   * Transform column names (e.g., from snake_case to camelCase)\n   */\n  transformColumnNames?: (name: string) => string\n}\n\n/**\n * Convert a Drizzle table to a query builder TableDefinition\n *\n * This enables using Drizzle schemas with the standalone query builder.\n *\n * @example\n * ```typescript\n * import { users } from './drizzle-schema'\n * import { fromDrizzleTable, createQueryBuilder } from 'postgres.do/query-builder'\n *\n * const usersTable = fromDrizzleTable(users)\n * const qb = createQueryBuilder(sql)\n *\n * // Type-safe queries using Drizzle schema\n * const results = await qb.select().from(usersTable).execute()\n * ```\n */\nexport function fromDrizzleTable<TDrizzleTable extends object>(\n  drizzleTable: TDrizzleTable,\n  options?: DrizzleAdapterOptions\n): TableDefinition {\n  // Extract table name - Drizzle stores it in Symbol.for('drizzle:Name')\n  // or in the table config\n  let tableName = 'unknown'\n\n  // Try different ways to get the table name\n  if ('_' in drizzleTable) {\n    const config = (drizzleTable as { _: { name?: string | undefined } })._\n    if (config?.name !== undefined) {\n      tableName = config.name\n    }\n  }\n\n  // Also check for table symbol\n  const tableSymbol = Symbol.for('drizzle:Name')\n  if (tableSymbol in drizzleTable) {\n    const symbolValue = (drizzleTable as Record<symbol, string | undefined>)[tableSymbol]\n    if (symbolValue !== undefined) {\n      tableName = symbolValue\n    }\n  }\n\n  // Extract columns from Drizzle table\n  const columns: Record<string, ColumnDefinition> = {}\n\n  for (const [key, value] of Object.entries(drizzleTable)) {\n    if (key.startsWith('_') || typeof value !== 'object' || value === null) {\n      continue\n    }\n\n    // Check if this is a Drizzle column\n    const columnObj = value as Record<string, unknown>\n    if ('name' in columnObj && 'dataType' in columnObj) {\n      const colName = options?.transformColumnNames\n        ? options.transformColumnNames(String(columnObj.name))\n        : String(columnObj.name)\n\n      // Determine TypeScript type from Drizzle data type\n      const dataType = columnObj.dataType as string\n      const notNull = columnObj.notNull === true\n      const hasDefault = columnObj.hasDefault === true || columnObj.default !== undefined\n\n      columns[key] = {\n        name: colName,\n        dataType: mapDrizzleType(dataType),\n        notNull,\n        hasDefault,\n        _columnBrand: 'column',\n      }\n    }\n  }\n\n  return {\n    tableName,\n    columns,\n    _tableBrand: 'table',\n  }\n}\n\n/**\n * Map Drizzle data type to JavaScript type\n */\nfunction mapDrizzleType(drizzleType: string): unknown {\n  switch (drizzleType) {\n    case 'string':\n    case 'text':\n    case 'varchar':\n    case 'char':\n    case 'uuid':\n      return '' as string\n\n    case 'number':\n    case 'integer':\n    case 'serial':\n    case 'smallint':\n    case 'real':\n    case 'double':\n    case 'numeric':\n      return 0 as number\n\n    case 'bigint':\n    case 'bigserial':\n      return BigInt(0) as bigint\n\n    case 'boolean':\n      return false as boolean\n\n    case 'date':\n    case 'timestamp':\n      return new Date() as Date\n\n    case 'json':\n    case 'jsonb':\n      return {} as unknown\n\n    case 'buffer':\n    case 'bytea':\n      return new Uint8Array() as Uint8Array\n\n    default:\n      return undefined as unknown\n  }\n}\n\n// ============================================================================\n// Type Inference Helpers\n// ============================================================================\n\n/**\n * Infer the select result type for a table\n */\nexport type SelectResult<T extends TableDefinition> = InferTableRow<T>\n\n/**\n * Infer the insert type for a table\n */\nexport type InsertType<T extends TableDefinition> = InferInsertRow<T>\n\n/**\n * Get column keys for a table\n */\nexport type ColumnKeys<T extends TableDefinition> = keyof T['columns']\n\n// ============================================================================\n// Re-export types\n// ============================================================================\n\nexport type {\n  TableDefinition,\n  ColumnDefinition,\n  InferTableRow,\n  InferInsertRow,\n}\n"],"mappings":"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","names":["min","max","sql","count","sql","col"]}