CoolFace
Apppublic

AK-21/Graphite-Industrial-Intelligence

sourceHugging Faceupdated 3mo agoView on Hugging Face
0likes
dialect.js715 linesDownload Raw Back to sqlite-core
1import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from "../alias.js";2import { CasingCache } from "../casing.js";3import { Column } from "../column.js";4import { entityKind, is } from "../entity.js";5import { DrizzleError } from "../errors.js";6import {7  getOperators,8  getOrderByOperators,9  Many,10  normalizeRelation,11  One12} from "../relations.js";13import { and, eq } from "../sql/index.js";14import { Param, SQL, sql } from "../sql/sql.js";15import { SQLiteColumn } from "./columns/index.js";16import { SQLiteTable } from "./table.js";17import { Subquery } from "../subquery.js";18import { getTableName, getTableUniqueName, Table } from "../table.js";19import { orderSelectedFields } from "../utils.js";20import { ViewBaseConfig } from "../view-common.js";21import { SQLiteViewBase } from "./view-base.js";22class SQLiteDialect {23  static [entityKind] = "SQLiteDialect";24  /** @internal */25  casing;26  constructor(config) {27    this.casing = new CasingCache(config?.casing);28  }29  escapeName(name) {30    return `"${name.replace(/"/g, '""')}"`;31  }32  escapeParam(_num) {33    return "?";34  }35  escapeString(str) {36    return `'${str.replace(/'/g, "''")}'`;37  }38  buildWithCTE(queries) {39    if (!queries?.length) return void 0;40    const withSqlChunks = [sql`with `];41    for (const [i, w] of queries.entries()) {42      withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);43      if (i < queries.length - 1) {44        withSqlChunks.push(sql`, `);45      }46    }47    withSqlChunks.push(sql` `);48    return sql.join(withSqlChunks);49  }50  buildDeleteQuery({51    table,52    where,53    returning,54    withList,55    limit,56    orderBy57  }) {58    const withSql = this.buildWithCTE(withList);59    const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0;60    const whereSql = where ? sql` where ${where}` : void 0;61    const orderBySql = this.buildOrderBy(orderBy);62    const limitSql = this.buildLimit(limit);63    return sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;64  }65  buildUpdateSet(table, set) {66    const tableColumns = table[Table.Symbol.Columns];67    const columnNames = Object.keys(tableColumns).filter(68      (colName) => set[colName] !== void 0 || tableColumns[colName]?.onUpdateFn !== void 069    );70    const setSize = columnNames.length;71    return sql.join(72      columnNames.flatMap((colName, i) => {73        const col = tableColumns[colName];74        const onUpdateFnResult = col.onUpdateFn?.();75        const value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));76        const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;77        if (i < setSize - 1) {78          return [res, sql.raw(", ")];79        }80        return [res];81      })82    );83  }84  buildUpdateQuery({85    table,86    set,87    where,88    returning,89    withList,90    joins,91    from,92    limit,93    orderBy94  }) {95    const withSql = this.buildWithCTE(withList);96    const setSql = this.buildUpdateSet(table, set);97    const fromSql = from && sql.join([sql.raw(" from "), this.buildFromTable(from)]);98    const joinsSql = this.buildJoins(joins);99    const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0;100    const whereSql = where ? sql` where ${where}` : void 0;101    const orderBySql = this.buildOrderBy(orderBy);102    const limitSql = this.buildLimit(limit);103    return sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;104  }105  /**106   * Builds selection SQL with provided fields/expressions107   *108   * Examples:109   *110   * `select <selection> from`111   *112   * `insert ... returning <selection>`113   *114   * If `isSingleTable` is true, then columns won't be prefixed with table name115   */116  buildSelection(fields, { isSingleTable = false } = {}) {117    const columnsLen = fields.length;118    const chunks = fields.flatMap(({ field }, i) => {119      const chunk = [];120      if (is(field, SQL.Aliased) && field.isSelectionField) {121        chunk.push(sql.identifier(field.fieldAlias));122      } else if (is(field, SQL.Aliased) || is(field, SQL)) {123        const query = is(field, SQL.Aliased) ? field.sql : field;124        if (isSingleTable) {125          chunk.push(126            new SQL(127              query.queryChunks.map((c) => {128                if (is(c, Column)) {129                  return sql.identifier(this.casing.getColumnCasing(c));130                }131                return c;132              })133            )134          );135        } else {136          chunk.push(query);137        }138        if (is(field, SQL.Aliased)) {139          chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);140        }141      } else if (is(field, Column)) {142        const tableName = field.table[Table.Symbol.Name];143        if (field.columnType === "SQLiteNumericBigInt") {144          if (isSingleTable) {145            chunk.push(146              sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`147            );148          } else {149            chunk.push(150              sql`cast(${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))} as text)`151            );152          }153        } else {154          if (isSingleTable) {155            chunk.push(sql.identifier(this.casing.getColumnCasing(field)));156          } else {157            chunk.push(158              sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`159            );160          }161        }162      } else if (is(field, Subquery)) {163        const entries = Object.entries(field._.selectedFields);164        if (entries.length === 1) {165          const entry = entries[0][1];166          const fieldDecoder = is(entry, SQL) ? entry.decoder : is(entry, Column) ? { mapFromDriverValue: (v) => entry.mapFromDriverValue(v) } : entry.sql.decoder;167          if (fieldDecoder) field._.sql.decoder = fieldDecoder;168        }169        chunk.push(field);170      }171      if (i < columnsLen - 1) {172        chunk.push(sql`, `);173      }174      return chunk;175    });176    return sql.join(chunks);177  }178  buildJoins(joins) {179    if (!joins || joins.length === 0) {180      return void 0;181    }182    const joinsArray = [];183    if (joins) {184      for (const [index, joinMeta] of joins.entries()) {185        if (index === 0) {186          joinsArray.push(sql` `);187        }188        const table = joinMeta.table;189        const onSql = joinMeta.on ? sql` on ${joinMeta.on}` : void 0;190        if (is(table, SQLiteTable)) {191          const tableName = table[SQLiteTable.Symbol.Name];192          const tableSchema = table[SQLiteTable.Symbol.Schema];193          const origTableName = table[SQLiteTable.Symbol.OriginalName];194          const alias = tableName === origTableName ? void 0 : joinMeta.alias;195          joinsArray.push(196            sql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : void 0}${sql.identifier(197              origTableName198            )}${alias && sql` ${sql.identifier(alias)}`}${onSql}`199          );200        } else {201          joinsArray.push(202            sql`${sql.raw(joinMeta.joinType)} join ${table}${onSql}`203          );204        }205        if (index < joins.length - 1) {206          joinsArray.push(sql` `);207        }208      }209    }210    return sql.join(joinsArray);211  }212  buildLimit(limit) {213    return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : void 0;214  }215  buildOrderBy(orderBy) {216    const orderByList = [];217    if (orderBy) {218      for (const [index, orderByValue] of orderBy.entries()) {219        orderByList.push(orderByValue);220        if (index < orderBy.length - 1) {221          orderByList.push(sql`, `);222        }223      }224    }225    return orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : void 0;226  }227  buildFromTable(table) {228    if (is(table, Table) && table[Table.Symbol.IsAlias]) {229      return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(230        table[Table.Symbol.OriginalName]231      )} ${sql.identifier(table[Table.Symbol.Name])}`;232    }233    return table;234  }235  buildSelectQuery({236    withList,237    fields,238    fieldsFlat,239    where,240    having,241    table,242    joins,243    orderBy,244    groupBy,245    limit,246    offset,247    distinct,248    setOperators249  }) {250    const fieldsList = fieldsFlat ?? orderSelectedFields(fields);251    for (const f of fieldsList) {252      if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, SQLiteViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? void 0 : getTableName(table)) && !((table2) => joins?.some(253        ({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName])254      ))(f.field.table)) {255        const tableName = getTableName(f.field.table);256        throw new Error(257          `Your "${f.path.join(258            "->"259          )}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?`260        );261      }262    }263    const isSingleTable = !joins || joins.length === 0;264    const withSql = this.buildWithCTE(withList);265    const distinctSql = distinct ? sql` distinct` : void 0;266    const selection = this.buildSelection(fieldsList, { isSingleTable });267    const tableSql = this.buildFromTable(table);268    const joinsSql = this.buildJoins(joins);269    const whereSql = where ? sql` where ${where}` : void 0;270    const havingSql = having ? sql` having ${having}` : void 0;271    const groupByList = [];272    if (groupBy) {273      for (const [index, groupByValue] of groupBy.entries()) {274        groupByList.push(groupByValue);275        if (index < groupBy.length - 1) {276          groupByList.push(sql`, `);277        }278      }279    }280    const groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : void 0;281    const orderBySql = this.buildOrderBy(orderBy);282    const limitSql = this.buildLimit(limit);283    const offsetSql = offset ? sql` offset ${offset}` : void 0;284    const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;285    if (setOperators.length > 0) {286      return this.buildSetOperations(finalQuery, setOperators);287    }288    return finalQuery;289  }290  buildSetOperations(leftSelect, setOperators) {291    const [setOperator, ...rest] = setOperators;292    if (!setOperator) {293      throw new Error("Cannot pass undefined values to any set operator");294    }295    if (rest.length === 0) {296      return this.buildSetOperationQuery({ leftSelect, setOperator });297    }298    return this.buildSetOperations(299      this.buildSetOperationQuery({ leftSelect, setOperator }),300      rest301    );302  }303  buildSetOperationQuery({304    leftSelect,305    setOperator: { type, isAll, rightSelect, limit, orderBy, offset }306  }) {307    const leftChunk = sql`${leftSelect.getSQL()} `;308    const rightChunk = sql`${rightSelect.getSQL()}`;309    let orderBySql;310    if (orderBy && orderBy.length > 0) {311      const orderByValues = [];312      for (const singleOrderBy of orderBy) {313        if (is(singleOrderBy, SQLiteColumn)) {314          orderByValues.push(sql.identifier(singleOrderBy.name));315        } else if (is(singleOrderBy, SQL)) {316          for (let i = 0; i < singleOrderBy.queryChunks.length; i++) {317            const chunk = singleOrderBy.queryChunks[i];318            if (is(chunk, SQLiteColumn)) {319              singleOrderBy.queryChunks[i] = sql.identifier(320                this.casing.getColumnCasing(chunk)321              );322            }323          }324          orderByValues.push(sql`${singleOrderBy}`);325        } else {326          orderByValues.push(sql`${singleOrderBy}`);327        }328      }329      orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;330    }331    const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : void 0;332    const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`);333    const offsetSql = offset ? sql` offset ${offset}` : void 0;334    return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;335  }336  buildInsertQuery({337    table,338    values: valuesOrSelect,339    onConflict,340    returning,341    withList,342    select343  }) {344    const valuesSqlList = [];345    const columns = table[Table.Symbol.Columns];346    const colEntries = Object.entries(columns).filter(347      ([_, col]) => !col.shouldDisableInsert()348    );349    const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));350    if (select) {351      const select2 = valuesOrSelect;352      if (is(select2, SQL)) {353        valuesSqlList.push(select2);354      } else {355        valuesSqlList.push(select2.getSQL());356      }357    } else {358      const values = valuesOrSelect;359      valuesSqlList.push(sql.raw("values "));360      for (const [valueIndex, value] of values.entries()) {361        const valueList = [];362        for (const [fieldName, col] of colEntries) {363          const colValue = value[fieldName];364          if (colValue === void 0 || is(colValue, Param) && colValue.value === void 0) {365            let defaultValue;366            if (col.default !== null && col.default !== void 0) {367              defaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);368            } else if (col.defaultFn !== void 0) {369              const defaultFnResult = col.defaultFn();370              defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);371            } else if (!col.default && col.onUpdateFn !== void 0) {372              const onUpdateFnResult = col.onUpdateFn();373              defaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);374            } else {375              defaultValue = sql`null`;376            }377            valueList.push(defaultValue);378          } else {379            valueList.push(colValue);380          }381        }382        valuesSqlList.push(valueList);383        if (valueIndex < values.length - 1) {384          valuesSqlList.push(sql`, `);385        }386      }387    }388    const withSql = this.buildWithCTE(withList);389    const valuesSql = sql.join(valuesSqlList);390    const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0;391    const onConflictSql = onConflict?.length ? sql.join(onConflict) : void 0;392    return sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;393  }394  sqlToQuery(sql2, invokeSource) {395    return sql2.toQuery({396      casing: this.casing,397      escapeName: this.escapeName,398      escapeParam: this.escapeParam,399      escapeString: this.escapeString,400      invokeSource401    });402  }403  buildRelationalQuery({404    fullSchema,405    schema,406    tableNamesMap,407    table,408    tableConfig,409    queryConfig: config,410    tableAlias,411    nestedQueryRelation,412    joinOn413  }) {414    let selection = [];415    let limit, offset, orderBy = [], where;416    const joins = [];417    if (config === true) {418      const selectionEntries = Object.entries(tableConfig.columns);419      selection = selectionEntries.map(([key, value]) => ({420        dbKey: value.name,421        tsKey: key,422        field: aliasedTableColumn(value, tableAlias),423        relationTableTsKey: void 0,424        isJson: false,425        selection: []426      }));427    } else {428      const aliasedColumns = Object.fromEntries(429        Object.entries(tableConfig.columns).map(([key, value]) => [430          key,431          aliasedTableColumn(value, tableAlias)432        ])433      );434      if (config.where) {435        const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where;436        where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);437      }438      const fieldsSelection = [];439      let selectedColumns = [];440      if (config.columns) {441        let isIncludeMode = false;442        for (const [field, value] of Object.entries(config.columns)) {443          if (value === void 0) {444            continue;445          }446          if (field in tableConfig.columns) {447            if (!isIncludeMode && value === true) {448              isIncludeMode = true;449            }450            selectedColumns.push(field);451          }452        }453        if (selectedColumns.length > 0) {454          selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter(455            (key) => !selectedColumns.includes(key)456          );457        }458      } else {459        selectedColumns = Object.keys(tableConfig.columns);460      }461      for (const field of selectedColumns) {462        const column = tableConfig.columns[field];463        fieldsSelection.push({ tsKey: field, value: column });464      }465      let selectedRelations = [];466      if (config.with) {467        selectedRelations = Object.entries(config.with).filter(468          (entry) => !!entry[1]469        ).map(([tsKey, queryConfig]) => ({470          tsKey,471          queryConfig,472          relation: tableConfig.relations[tsKey]473        }));474      }475      let extras;476      if (config.extras) {477        extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras;478        for (const [tsKey, value] of Object.entries(extras)) {479          fieldsSelection.push({480            tsKey,481            value: mapColumnsInAliasedSQLToAlias(value, tableAlias)482          });483        }484      }485      for (const { tsKey, value } of fieldsSelection) {486        selection.push({487          dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name,488          tsKey,489          field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,490          relationTableTsKey: void 0,491          isJson: false,492          selection: []493        });494      }495      let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? [];496      if (!Array.isArray(orderByOrig)) {497        orderByOrig = [orderByOrig];498      }499      orderBy = orderByOrig.map((orderByValue) => {500        if (is(orderByValue, Column)) {501          return aliasedTableColumn(orderByValue, tableAlias);502        }503        return mapColumnsInSQLToAlias(orderByValue, tableAlias);504      });505      limit = config.limit;506      offset = config.offset;507      for (const {508        tsKey: selectedRelationTsKey,509        queryConfig: selectedRelationConfigValue,510        relation511      } of selectedRelations) {512        const normalizedRelation = normalizeRelation(513          schema,514          tableNamesMap,515          relation516        );517        const relationTableName = getTableUniqueName(relation.referencedTable);518        const relationTableTsName = tableNamesMap[relationTableName];519        const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;520        const joinOn2 = and(521          ...normalizedRelation.fields.map(522            (field2, i) => eq(523              aliasedTableColumn(524                normalizedRelation.references[i],525                relationTableAlias526              ),527              aliasedTableColumn(field2, tableAlias)528            )529          )530        );531        const builtRelation = this.buildRelationalQuery({532          fullSchema,533          schema,534          tableNamesMap,535          table: fullSchema[relationTableTsName],536          tableConfig: schema[relationTableTsName],537          queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue,538          tableAlias: relationTableAlias,539          joinOn: joinOn2,540          nestedQueryRelation: relation541        });542        const field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);543        selection.push({544          dbKey: selectedRelationTsKey,545          tsKey: selectedRelationTsKey,546          field,547          relationTableTsKey: relationTableTsName,548          isJson: true,549          selection: builtRelation.selection550        });551      }552    }553    if (selection.length === 0) {554      throw new DrizzleError({555        message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.`556      });557    }558    let result;559    where = and(joinOn, where);560    if (nestedQueryRelation) {561      let field = sql`json_array(${sql.join(562        selection.map(563          ({ field: field2 }) => is(field2, SQLiteColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2564        ),565        sql`, `566      )})`;567      if (is(nestedQueryRelation, Many)) {568        field = sql`coalesce(json_group_array(${field}), json_array())`;569      }570      const nestedSelection = [571        {572          dbKey: "data",573          tsKey: "data",574          field: field.as("data"),575          isJson: true,576          relationTableTsKey: tableConfig.tsName,577          selection578        }579      ];580      const needsSubquery = limit !== void 0 || offset !== void 0 || orderBy.length > 0;581      if (needsSubquery) {582        result = this.buildSelectQuery({583          table: aliasedTable(table, tableAlias),584          fields: {},585          fieldsFlat: [586            {587              path: [],588              field: sql.raw("*")589            }590          ],591          where,592          limit,593          offset,594          orderBy,595          setOperators: []596        });597        where = void 0;598        limit = void 0;599        offset = void 0;600        orderBy = void 0;601      } else {602        result = aliasedTable(table, tableAlias);603      }604      result = this.buildSelectQuery({605        table: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),606        fields: {},607        fieldsFlat: nestedSelection.map(({ field: field2 }) => ({608          path: [],609          field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2610        })),611        joins,612        where,613        limit,614        offset,615        orderBy,616        setOperators: []617      });618    } else {619      result = this.buildSelectQuery({620        table: aliasedTable(table, tableAlias),621        fields: {},622        fieldsFlat: selection.map(({ field }) => ({623          path: [],624          field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field625        })),626        joins,627        where,628        limit,629        offset,630        orderBy,631        setOperators: []632      });633    }634    return {635      tableTsKey: tableConfig.tsName,636      sql: result,637      selection638    };639  }640}641class SQLiteSyncDialect extends SQLiteDialect {642  static [entityKind] = "SQLiteSyncDialect";643  migrate(migrations, session, config) {644    const migrationsTable = config === void 0 ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";645    const migrationTableCreate = sql`646			CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (647				id SERIAL PRIMARY KEY,648				hash text NOT NULL,649				created_at numeric650			)651		`;652    session.run(migrationTableCreate);653    const dbMigrations = session.values(654      sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`655    );656    const lastDbMigration = dbMigrations[0] ?? void 0;657    session.run(sql`BEGIN`);658    try {659      for (const migration of migrations) {660        if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {661          for (const stmt of migration.sql) {662            session.run(sql.raw(stmt));663          }664          session.run(665            sql`INSERT INTO ${sql.identifier(666              migrationsTable667            )} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`668          );669        }670      }671      session.run(sql`COMMIT`);672    } catch (e) {673      session.run(sql`ROLLBACK`);674      throw e;675    }676  }677}678class SQLiteAsyncDialect extends SQLiteDialect {679  static [entityKind] = "SQLiteAsyncDialect";680  async migrate(migrations, session, config) {681    const migrationsTable = config === void 0 ? "__drizzle_migrations" : typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";682    const migrationTableCreate = sql`683			CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (684				id SERIAL PRIMARY KEY,685				hash text NOT NULL,686				created_at numeric687			)688		`;689    await session.run(migrationTableCreate);690    const dbMigrations = await session.values(691      sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`692    );693    const lastDbMigration = dbMigrations[0] ?? void 0;694    await session.transaction(async (tx) => {695      for (const migration of migrations) {696        if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {697          for (const stmt of migration.sql) {698            await tx.run(sql.raw(stmt));699          }700          await tx.run(701            sql`INSERT INTO ${sql.identifier(702              migrationsTable703            )} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`704          );705        }706      }707    });708  }709}710export {711  SQLiteAsyncDialect,712  SQLiteDialect,713  SQLiteSyncDialect714};715//# sourceMappingURL=dialect.js.map